空
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'
),那么在 default
中 x
将不再是 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
的代码。