数组类型(Array Types)
注意:数组有时也被用作JavaScript中的元组,这些元素在Flow中有不同的注释。
数组是JavaScript中特殊的类列表对象类型。你可以用几种不同的方式创建数组。
new Array(1, 2, 3); // [1, 2, 3];
new Array(3); // [undefined, undefined, undefined]
[1, 2, 3]; // [1, 2, 3];
你也可以创建数组并稍后为其添加值:
let arr = []; // []
arr[0] = 1; // [1]
arr[1] = 2; // [1, 2]
arr[2] = 3; // [1, 2, 3]
数组类型(Array Type)
要创建数组类型,可以使用Array<Type>
type,其中Type
是数组中元素的类型。
let arr: Array<number> = [1, 2, 3];
let arr1: Array<boolean> = [true, false, true];
let arr2: Array<string> = ["A", "B", "C"];
let arr3: Array<mixed> = [1, true, "three"]
数组速记语法(Array Type Shorthand Syntax)
数组语法更简短的方式是:Type[]
。
let arr: number[] = [0, 1, 2, 3];
?Type[]
与?Array<T>
是等价的。
// @flow
let arr1: ?number[] = null; // Works!
let arr2: ?number[] = [1, 2]; // Works!
let arr3: ?number[] = [null]; // Error!
如果你想使它成为Array<?T>,你可以使用括号:
(?Type)[]`
// @flow
let arr1: (?number)[] = null; // Error!
let arr2: (?number)[] = [1, 2]; // Works!
let arr3: (?number)[] = [null]; // Works!
数组访问是不安全的
当你从数组中检索一个元素时,总是有可能是未定义的。你可以访问一个超出数组边界的索引,或者访问稀疏数组中不存在的元素。
// @flow
let array: Array<number> = [0, 1, 2];
let value: number = array[3]; // Works. ^ undefined
// @flow
let array: Array<number> = [];
array[0] = 0;
array[2] = 2;
let value: number = array[1]; // Works. ^ undefined
为了安全起见,Flow必须将每个数组访问标记为“可能未定义”。但是Flow不这样做,因为使用起来非常不方便。你将被迫改进访问数组时获得的每个值的类型。
let array: Array<number> = [0, 1, 2];
let value: number | void = array[1];
if (value !== undefined) {
// number
}