flow中文文檔(五)

數(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');
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末原杂,一起剝皮案震驚了整個(gè)濱河市印颤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌穿肄,老刑警劉巖年局,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異被碗,居然都是意外死亡某宪,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門锐朴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蔼囊,你說(shuō)我怎么就攤上這事焚志∫旅裕” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵酱酬,是天一觀的道長(zhǎng)壶谒。 經(jīng)常有香客問(wèn)我,道長(zhǎng)膳沽,這世上最難降的妖魔是什么汗菜? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮挑社,結(jié)果婚禮上陨界,老公的妹妹穿的比我還像新娘。我一直安慰自己痛阻,他們只是感情好菌瘪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阱当,像睡著了一般俏扩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弊添,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天录淡,我揣著相機(jī)與錄音,去河邊找鬼油坝。 笑死嫉戚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的免钻。 我是一名探鬼主播彼水,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼极舔!你這毒婦竟也來(lái)了凤覆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拆魏,失蹤者是張志新(化名)和其女友劉穎盯桦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渤刃,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拥峦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卖子。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片略号。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出玄柠,到底是詐尸還是另有隱情突梦,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布羽利,位于F島的核電站宫患,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏这弧。R本人自食惡果不足惜娃闲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望匾浪。 院中可真熱鬧皇帮,春花似錦、人聲如沸户矢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)梯浪。三九已至捌年,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挂洛,已是汗流浹背礼预。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虏劲,地道東北人托酸。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像柒巫,于是被迫代替她去往敵國(guó)和親励堡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容