Maybe 類型
您可以使用 ?
為類型加上前綴,以使其成為與 null
和 void
的 聯集:?T
等同於聯集 T | null | void
。
例如,?number
等同於 number | null | void
,並允許數字、null
和 undefined
作為值。它「可能」是一個數字。
1function acceptsMaybeNumber(value: ?number) {2 // ...3}4
5acceptsMaybeNumber(42); // Works!6acceptsMaybeNumber(); // Works! (implicitly undefined)7acceptsMaybeNumber(undefined); // Works!8acceptsMaybeNumber(null); // Works!9acceptsMaybeNumber("42"); // Error!
9:20-9:23: Cannot call `acceptsMaybeNumber` with `"42"` bound to `value` because string [1] is incompatible with number [2]. [incompatible-call]
對於物件,遺失的屬性與明確的 undefined
屬性不同。
1function acceptsMaybeProp({value}: {value: ?number}) {2 // ...3}4
5acceptsMaybeProp({value: undefined}); // Works!6acceptsMaybeProp({}); // Error!
6:18-6:19: Cannot call `acceptsMaybeProp` with object literal bound to the first parameter because property `value` is missing in object literal [1] but exists in object type [2]. [prop-missing]
如果您要允許遺失的屬性,請使用 選用屬性 語法,其中 ?
置於冒號之前。也可以將兩種語法結合起來,以取得選用的 maybe 類型,例如 {value?: ?number}
。
精煉 maybe 類型
假設我們有類型 ?number
,如果我們要將該值用作 number
,則需要先檢查它是否不是 null
或 undefined
。
1function acceptsMaybeNumber(value: ?number): number {2 if (value !== null && value !== undefined) {3 return value * 2;4 }5 return 0;6}
您可以使用單一的 != null
檢查來簡化針對 null
和 undefined
的兩個檢查,這將同時執行這兩個檢查。
1function acceptsMaybeNumber(value: ?number): number {2 if (value != null) {3 return value * 2;4 }5 return 0;6}
JavaScript 中大多數的雙等號檢查都是不建議使用的,但上述模式是安全的(它會明確檢查 null
和 undefined
)。
你也可以將其翻轉,並在使用值之前檢查以確保該值具有 number
類型。
1function acceptsMaybeNumber(value: ?number): number {2 if (typeof value === 'number') {3 return value * 2;4 }5 return 0;6}
但是,類型精簡可能會遺失。例如,在精簡物件屬性的類型後呼叫函式,將會使此精簡無效。請參閱 精簡無效化 文件以取得更多詳細資訊,了解 Flow 為何會這樣運作,以及如何避免此常見的陷阱。