數(shù)組類型
要?jiǎng)?chuàng)建數(shù)組類型扎瓶,可以使用Array <Type> type庄涡,其中Type是數(shù)組中元素的類型腻要。例如享完,要為數(shù)組數(shù)組創(chuàng)建類型舞终,請(qǐng)使用Array <number>霞揉。
let arr: Array<number> = [1, 2, 3];
You can put any type within Array<Type>.
let arr1: Array<boolean> = [true, false, true];
let arr2: Array<string> = ["A", "B", "C"];
let arr3: Array<mixed> = [1, true, "three"]
快速語(yǔ)法
let arr: number[] = [0, 1, 2, 3];
請(qǐng)注意旬薯,?Type []相當(dāng)于适秩?Array <T>而不是Array <绊序?T>硕舆。
// @flow
let arr1: ?number[] = null; // Works!
let arr2: ?number[] = [1, 2]; // Works!
let arr3: ?number[] = [null]; // Error!
如果你想使它成為Array <?T>你可以使用括號(hào)骤公,如:(抚官?Type)[]
// @flow
let arr1: (?number)[] = null; // Error!
let arr2: (?number)[] = [1, 2]; // Works!
let arr3: (?number)[] = [null]; // Works!
數(shù)組訪問(wèn)不安全
從數(shù)組中檢索元素時(shí),始終存在未定義的元素阶捆。您可以訪問(wèn)一個(gè)超出數(shù)組邊界的索引凌节,或者該元素不能存在,因?yàn)樗且粋€(gè)“稀疏數(shù)組”洒试。
例如倍奢,您可能正在訪問(wèn)超出數(shù)組范圍的元素
// @flow
let array: Array<number> = [0, 1, 2];
let value: number = array[3]; // Works.
// ^ undefined
或者你可以訪問(wèn)一個(gè)不存在的元素,如果它是一個(gè)“稀疏數(shù)組”垒棋。
// @flow
let array: Array<number> = [];
array[0] = 0;
array[2] = 2;
let value: number = array[1]; // Works.
// ^ undefined
為了使這個(gè)安全卒煞,F(xiàn)low必須將每個(gè)單獨(dú)的數(shù)組訪問(wèn)標(biāo)記為“可能未定義”。
Flow不會(huì)這樣做叼架,因?yàn)樗褂闷饋?lái)非常不方便跷坝。您將被迫優(yōu)化訪問(wèn)數(shù)組時(shí)獲得的每個(gè)值的類型。
let array: Array<number> = [0, 1, 2];
let value: number | void = array[1];
if (value !== undefined) {
// number
}
由于Flow變得更加智能碉碉,將來(lái)有可能解決這個(gè)問(wèn)題柴钻,但是現(xiàn)在你應(yīng)該意識(shí)到這一點(diǎn)。
元組類型
元組是一種列表垢粮,但具有有限的項(xiàng)目集贴届。在JavaScript中,使用數(shù)組創(chuàng)建元組蜡吧。
在Flow中毫蚓,您可以使用[type,type昔善,type]語(yǔ)法創(chuàng)建元組元潘。
let tuple1: [number] = [1];
let tuple2: [number, boolean] = [1, true];
let tuple3: [number, boolean, string] = [1, true, "three"];
當(dāng)您從特定索引處的元組獲取值時(shí),它將返回該索引處的類型君仆。
// @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];
如果Flow不知道您嘗試訪問(wèn)哪個(gè)索引,它將返回所有可能的類型返咱。
// @flow
let tuple: [number, boolean, string] = [1, true, "three"];
function getItem(n: number) {
let val: number | boolean | string = tuple[n];
// ...
}
在元組內(nèi)設(shè)置新值時(shí)钥庇,新值必須與該索引處的類型匹配。
// @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!
嚴(yán)格執(zhí)行元組長(zhǎng)度
元組的長(zhǎng)度稱為“arity”咖摹。在Flow中嚴(yán)格執(zhí)行元組的長(zhǎng)度评姨。
元組只匹配相同長(zhǎng)度的元組
他的意思是不能使用較短的元組代替較長(zhǎng)的元組。
// @flow
let tuple1: [number, boolean] = [1, true];
// $ExpectError
let tuple2: [number, boolean, void] = tuple1; // Error!
此外萤晴,不能使用較長(zhǎng)的元組來(lái)代替較短的元組吐句。
// @flow
let tuple1: [number, boolean, void] = [1, true];
// $ExpectError
let tuple2: [number, boolean] = tuple1; // Error!
元組與數(shù)組類型不匹配
由于Flow不知道數(shù)組的長(zhǎng)度胁后,因此無(wú)法將Array <T>類型傳遞給元組。
// @flow
let array: Array<number> = [1, 2];
// $ExpectError
let tuple: [number, number] = array; // Error!
另外一個(gè)元組類型不能傳遞給Array <T>類型嗦枢,因?yàn)槟菢幽憔涂梢砸圆话踩姆绞礁淖冊(cè)M攀芯。
// @flow
let tuple: [number, number] = [1, 2];
// $ExpectError
let array: Array<number> = tuple; // Error!
不能在元組上使用變異數(shù)組方法
您不能使用改變?cè)M的Array.prototype方法,只能使用不改變?cè)M的方法净宵。
// @flow
let tuple: [number, number] = [1, 2];
tuple.join(', '); // Works!
// $ExpectError
tuple.push(3); // Error!
Class類型
Flow中的JavaScript類既可以作為值敲才,也可以作為類型。
您可以像沒有Flow一樣編寫類择葡,但是您可以使用類的名稱作為類型紧武。
class MyClass {
// ...
}
let myInstance: MyClass = new MyClass();
Flow中的類與普通的JavaScript類相同,但添加了類型敏储。
Class 方法
就像在函數(shù)中一樣阻星,類方法可以有參數(shù)(輸入)和返回(輸出)的注釋。
class MyClass {
method(value: string): number { /* ... */ }
}
class 字段(屬性)
每當(dāng)要在Flow中使用類字段時(shí)已添,必須先給它一個(gè)注釋妥箕。
// @flow
class MyClass {
method() {
// $ExpectError
this.prop = 42; // Error!
}
}
上面的方式是錯(cuò)誤的在flow中。字段在類的主體內(nèi)注釋更舞,字段名稱后跟冒號(hào):和類型畦幢。
// @flow
class MyClass {
prop: number;
method() {
this.prop = 42;
}
}
Flow還支持使用類屬性語(yǔ)法
class MyClass {
prop = 42;
}
使用此語(yǔ)法時(shí),不需要為其指定類型注釋缆蝉。但如果你需要宇葱,你還可以。
class MyClass {
prop: number = 42;
}
類泛型
classes 也可以有自己的泛型
class MyClass<A, B, C> {
property: A;
method(val: B): C {
// ...
}
}
類泛型是參數(shù)化的刊头。當(dāng)您使用類作為類型時(shí)黍瞧,您需要為每個(gè)泛型傳遞參數(shù)。
// @flow
class MyClass<A, B, C> {
constructor(arg1: A, arg2: B, arg3: C) {
// ...
}
}
var val: MyClass<number, boolean, string> = new MyClass(1, true, 'three');