元组(Tuple Types)
类似元组的数组值
元组是一种列表,但具有有限的一组项目。在JavaScript中,元组是使用数组创建的。
在Flow中,你可以使用[type,type,type]
语法创建元组。
let tuple1: [number] = [1];
let tuple2: [number, boolean] = [1, true];
let tuple3: [number, boolean, string] = [1, true, "three"];
当你从元组特定索引中获取值时,它将返回该索引处的类型。
// @flow
let tuple: [number, boolean, string] = [1, true, "three"];
let num : number = tuple[0]; // Works!
let bool : boolean = tuple[1]; // Works!
let str : string = tuple[2]; // Works!
当你从元组不存在的索引中获取值时,它将返回void
// @flow
let tuple: [number, boolean, string] = [1, true, "three"];
let none: void = tuple[3]; // void
如果Flow不知道你尝试访问哪个索引,它将返回所有可能的类型。
// @flow
let tuple: [number, boolean, string] = [1, true, "three"];
function getItem(n: number) {
let val: number | boolean | string = tuple[n];
// ...
}
在元组内设置新值时,新值必须与该索引处的类型匹配。
// @flow
let tuple: [number, boolean, string] = [1, true, "three"];
tuple[0] = 2; // Works!
tuple[1] = false; // Works!
tuple[2] = "foo"; // Works!
// $ExpectError
tuple[0] = "bar"; // Error!
// $ExpectError
tuple[1] = 42; // Error!
// $ExpectError
tuple[2] = false; // Error!
严格执行元组长度(元数)
元组的长度被称为“元数”。Flow中严格执行元组的长度。
元组只能匹配长度相同的元组
// @flow
let tuple1: [number, boolean] = [1, true];
// $ExpectError
let tuple2: [number, boolean, void] = tuple1; // Error!
// @flow
let tuple1: [number, boolean, void] = [1, true];
// $ExpectError
let tuple2: [number, boolean] = tuple1; // Error!
元组不匹配数组类型
由于Flow不知道数组的长度,因此Array<T>
类型不能传递给元组。
// @flow
let array: Array<number> = [1, 2];
// $ExpectError
let tuple: [number, number] = array; // Error!
此外,元组类型不能传递给Array<T>
类型,因为这样可以以不安全的方式改变元组。
// @flow
let tuple: [number, number] = [1, 2];
// $ExpectError
let array: Array<number> = tuple; // Error!
不能在元组上使用变异数组方法
// @flow
let tuple: [number, number] = [1, 2];
tuple.join(', '); // Works!
// $ExpectError
tuple.push(3); // Error!
变异的数组方法: