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
周围使用括号。