flow中文文檔(八)

聯(lián)合類型

有時点楼,創(chuàng)建一個其他類型之一的類型很有用。例如白对,您可能希望編寫一個接受一組原始值類型的函數(shù)掠廓。對于此Flow支持聯(lián)合類型。

// @flow
function toStringPrimitives(value: number | boolean | string) {
  return String(value);
}

toStringPrimitives(1);       // Works!
toStringPrimitives(true);    // Works!
toStringPrimitives('three'); // Works!

// $ExpectError
toStringPrimitives({ prop: 'val' }); // Error!
// $ExpectError
toStringPrimitives([1, 2, 3, 4, 5]); // Error!

語法

聯(lián)合類型是任意數(shù)量的類型甩恼,由 | 連接蟀瞧。

Type1 | Type2 | ... | TypeN

您還可以添加一個引導(dǎo)豎線,這在將聯(lián)合類型拆分到多行時非常有用条摸。

type Foo =
  | Type1
  | Type2
  | ...
  | TypeN

聯(lián)合類型的每個成員可以是任何類型悦污,甚至可以是另一個聯(lián)合類型。

type Numbers = 1 | 2;
type Colors = 'red' | 'blue'

type Fish = Numbers | Colors;

聯(lián)合類型需要一個輸入钉蒲,但全部輸出

在調(diào)用接受聯(lián)合類型的函數(shù)時切端,必須傳入其中一種類型。但是在函數(shù)內(nèi)部顷啼,我們需要處理所有可能的類型踏枣。

讓我們重寫函數(shù)昌屉,分別處理每種類型

// @flow
// $ExpectError
function toStringPrimitives(value: number | boolean | string): string { // Error!
  if (typeof value === 'number') {
    return String(value);
  } else if (typeof value === 'boolean') {
    return String(value);
  }
}

您會注意到,如果我們不處理值的每種可能類型茵瀑,F(xiàn)low將給我們一個錯誤间驮。

聯(lián)合 & 細化

當(dāng)您有一個聯(lián)合類型的值時,將其分開并分別處理每個單獨的類型通常是很有用的马昨。使用流中的聯(lián)合類型竞帽,您可以將值“細化”為單個類型。

// @flow
function toStringPrimitives(value: number | boolean | string) {
  if (typeof value === 'number') {
    return value.toLocaleString([], { maximumSignificantDigits: 3 }); // Works!
  }
  // ...
}

通過檢查值的類型并測試它是否是一個數(shù)字鸿捧,F(xiàn)low知道在該塊內(nèi)部它只是一個數(shù)字屹篓。然后,我們可以編寫代碼笛谦,將我們的值視為該塊內(nèi)的一個數(shù)字抱虐。

不相交聯(lián)合

在flow中有一種特殊類型的聯(lián)合,稱為“不相交聯(lián)合”饥脑,可用于改進恳邀。這些不相交的聯(lián)合由任意數(shù)量的對象類型組成,每個對象類型都由一個屬性標(biāo)記灶轰。

例如谣沸,假設(shè)我們有一個函數(shù),用于在發(fā)送請求后處理來自服務(wù)器的響應(yīng)笋颤。當(dāng)請求成功時乳附,我們將返回一個具有成功屬性的對象,該屬性是true和我們已經(jīng)更新的值伴澄。

{ success: true, value: false };

當(dāng)請求失敗時赋除,我們將獲得一個成功設(shè)置為false的對象和一個描述錯誤的Error屬性。

{ success: false, error: 'Bad request' };

我們可以嘗試用一個對象類型來表示這兩個對象非凌。但是举农,我們很快就會遇到這樣的問題:我們根據(jù)Success屬性知道一個屬性存在,但Flow不知道敞嗡。

// @flow
type Response = {
  success: boolean,
  value?: boolean,
  error?: string
};

function handleResponse(response: Response) {
  if (response.success) {
    // $ExpectError
    var value: boolean = response.value; // Error!
  } else {
    // $ExpectError
    var error: string = response.error; // Error!
  }
}

試圖把這兩種不同的類型合并成一種颁糟,只會給我們帶來麻煩。

相反喉悴,如果我們創(chuàng)建這兩種對象類型的聯(lián)合類型棱貌,F(xiàn)low將能夠根據(jù)Success屬性知道我們使用的是哪個對象。

// @flow
type Success = { success: true, value: boolean };
type Failed  = { success: false, error: string };

type Response = Success | Failed;

function handleResponse(response: Response) {
  if (response.success) {
    var value: boolean = response.value; // Works!
  } else {
    var error: string = response.error; // Works!
  }
}

精確的不相交聯(lián)合

不相交的聯(lián)合要求您使用單個屬性來區(qū)分每種對象類型箕肃。不能通過不同的屬性區(qū)分兩個不同的對象婚脱。

// @flow
type Success = { success: true, value: boolean };
type Failed  = { error: true, message: string };

function handleResponse(response:  Success | Failed) {
  if (response.success) {
    // $ExpectError
    var value: boolean = response.value; // Error!
  }
}

這是因為在Flow中傳遞一個屬性比對象類型期望的屬性多的對象值是可以的(因為寬度子類型)。

// @flow
type Success = { success: true, value: boolean };
type Failed  = { error: true, message: string };

function handleResponse(response:  Success | Failed) {
  // ...
}

handleResponse({
  success: true,
  error: true,
  value: true,
  message: 'hi'
});

除非這些物體在某種程度上相互沖突,否則就沒有辦法區(qū)分它們起惕。

但是涡贱,要解決這個問題,您可以使用精確的對象類型惹想。

// @flow
type Success = {| success: true, value: boolean |};
type Failed  = {| error: true, message: string |};

type Response = Success | Failed;

function handleResponse(response: Response) {
  if (response.success) {
    var value: boolean = response.value;
  } else {
    var message: string = response.message;
  }
}

有了精確的對象類型问词,我們就不可能有額外的屬性,所以對象之間會發(fā)生沖突嘀粱,我們就能區(qū)分出哪個是哪個激挪。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锋叨,隨后出現(xiàn)的幾起案子垄分,更是在濱河造成了極大的恐慌,老刑警劉巖娃磺,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薄湿,死亡現(xiàn)場離奇詭異,居然都是意外死亡偷卧,警方通過查閱死者的電腦和手機豺瘤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來听诸,“玉大人坐求,你說我怎么就攤上這事∩卫妫” “怎么了桥嗤?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長仔蝌。 經(jīng)常有香客問我泛领,道長,這世上最難降的妖魔是什么敛惊? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任渊鞋,我火速辦了婚禮,結(jié)果婚禮上豆混,老公的妹妹穿的比我還像新娘篓像。我一直安慰自己动知,他們只是感情好皿伺,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盒粮,像睡著了一般鸵鸥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天妒穴,我揣著相機與錄音宋税,去河邊找鬼。 笑死讼油,一個胖子當(dāng)著我的面吹牛杰赛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矮台,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼乏屯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瘦赫?” 一聲冷哼從身側(cè)響起辰晕,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎确虱,沒想到半個月后含友,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡校辩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年窘问,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片召川。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡南缓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出荧呐,到底是詐尸還是另有隱情汉形,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布倍阐,位于F島的核電站概疆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏峰搪。R本人自食惡果不足惜岔冀,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望概耻。 院中可真熱鬧使套,春花似錦、人聲如沸鞠柄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厌杜。三九已至奉呛,卻和暖如春计螺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞧壮。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工登馒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咆槽。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓陈轿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親秦忿。 傳聞我的和親對象是個殘疾皇子济欢,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

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

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,131評論 0 13
  • 哎呀我又來舉栗子了~ _(┐「ε:)_話說有次野比大雄回家拿了個100分的卷子…… 騙誰靶≡ā7ㄈ臁!3晏搿(╬ ̄皿 ̄)=#(...
    voodooxtm閱讀 294評論 0 0
  • 今天是周一惨远,早上早早起床把孩子喊起來谜悟。吃完飯孩子自己穿好鞋子和校服,準(zhǔn)備好上學(xué)換的鞋子北秽,收拾妥當(dāng)我們一起出發(fā)上學(xué)...
    李奕燊閱讀 127評論 0 0
  • 這些事情之前有想到過葡幸,但是一下都冒出來,著實讓人難過了一陣子贺氓,同事們覺得90后太年輕蔚叨,加上剛來公司不會做人,沒有什...
    ppn老頭閱讀 219評論 0 0
  • 文/孤鳥差魚 一輪殘月 裁縫忘了補完全 縫紉機的踏板已壞 還要過個十幾天 你將就還賞幾天 中秋節(jié)會圓滿 秋風(fēng)自來 ...
    孤鳥差魚閱讀 331評論 0 2