跳至主要内容

可选类型

您可以使用 ? 前缀一个类型,使其成为与 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]

如果您想允许缺少属性,请使用 可选属性 语法,其中 ? 放在冒号之前。也可以将两种语法结合起来,用于可选的可选类型,例如 {value?: ?number}

细化可选类型

假设我们有类型 ?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 为什么这样工作以及如何避免这种常见陷阱。