跳至主要內容

Maybe 類型

您可以使用 ? 為類型加上前綴,以使其成為與 nullvoid聯集?T 等同於聯集 T | null | void

例如,?number 等同於 number | null | void,並允許數字、nullundefined 作為值。它「可能」是一個數字。

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,則需要先檢查它是否不是 nullundefined

1function acceptsMaybeNumber(value: ?number): number {2  if (value !== null && value !== undefined) {3    return value * 2;4  }5  return 0;6}

您可以使用單一的 != null 檢查來簡化針對 nullundefined 的兩個檢查,這將同時執行這兩個檢查。

1function acceptsMaybeNumber(value: ?number): number {2  if (value != null) {3    return value * 2;4  }5  return 0;6}

JavaScript 中大多數的雙等號檢查都是不建議使用的,但上述模式是安全的(它會明確檢查 nullundefined)。

你也可以將其翻轉,並在使用值之前檢查以確保該值具有 number 類型。

1function acceptsMaybeNumber(value: ?number): number {2  if (typeof value === 'number') {3    return value * 2;4  }5  return 0;6}

但是,類型精簡可能會遺失。例如,在精簡物件屬性的類型後呼叫函式,將會使此精簡無效。請參閱 精簡無效化 文件以取得更多詳細資訊,了解 Flow 為何會這樣運作,以及如何避免此常見的陷阱。