跳至主要内容

empty 类型没有值。它是 所有其他类型的子类型(即 底类型)。这样,它就与 mixed 相反,mixed 是所有类型的超类型。

使用 empty 对代码进行注解并不常见。但是,在某些情况下它可能很有用。

如果有一个始终抛出异常的函数,可以将返回值注解为 empty,因为函数永远不会返回。

1function throwIt(msg: string): empty {2  throw new Error(msg);3}

可以使用强制转换为 empty 来断言已从联合中剔除了所有成员。

1function f(x: 'a' | 'b'): number {2  switch (x) {3    case 'a':4      return 1;5    case 'b':6      return 2;7    default:8      return (x: empty);9  }10}

如果没有检查联合中的所有成员(例如,将 x 的类型更改为 'a' | 'b' | 'c'),那么在 defaultx 将不再是 empty,Flow 会报错。

注意:如果希望默认情况下对枚举进行详尽检查,而无需强制转换为 empty,可以在项目中启用并使用 Flow 枚举

由于 empty 是所有类型的子类型,因此允许对具有 empty 类型的任何内容执行所有操作。但是,由于没有值可以是 empty,因此这与 any 不同,是“安全的”。

1const str = "hello";2
3if (typeof str === "string") {4  (str: string); // Yes it's a string5} else {6  // Works! Since we will never enter this branch7  (str: empty);8  const n: number = str + 1;9}

我们在上面用引号引出“安全”,因为由于代码中的类型安全漏洞或 Flow 本身中的错误,可能会获得类型为 empty 的值。

可以使用 coverage 命令来识别类型为 empty 的代码。