打字稿:为什么"typeof"运算符的结果与文字正确比较,而与常量的结果不正确?



Typescript:为什么"typeof"运算符的结果与文字相比正确,而常量的结果不正确?

function foo(param: string) { }
const s = 'string';
function test(param: string | number) {
if (typeof (param) == 'string') foo(param);  // ok
if (typeof (param) == s) foo(param);         // error
}

错误消息:"字符串 |number"不可分配给类型为"字符串"的参数。类型'数字'不能分配给类型'字符串'。

TypeScript 对使用值为"string""number""boolean""symbol"的 typeof 有特殊的处理,但前提是它们是文字。

TypeScript 规范对以下类型保护是这样说的:

形式为 x === s 的类型保护,其中s 是具有值"字符串"、"数字"或"布尔值"的字符串文本, 如果为 True,则将 x 的类型缩小到给定的基元类型,前提是它是 X 类型的子类型,或者,如果 x 的类型是联合类型,则从 x 的类型中删除所有不是给定基元类型的子类型的构成类型,或者 如果为 false,则从 x 类型中删除基元类型。

如此处所示,等号的右侧可以采用三个(实际上是四个,包括'symbol'(值之一,以便将typeof用作类型保护。其他任何东西(例如s(,它不起作用。

旁注:typeof (param)中无需在param周围使用括号。

最新更新