首页 > 解决方案 > 打字稿 typeof 字符串无法按预期工作

问题描述

谁能解释为什么第二个变体不起作用?它是一个错误吗?

const prints = (s: string): void => console.log(s);
var x: string | number = Date.now() % 2 ? "test" : 5;

// 1st: working
if (typeof x === "string") {
  prints(x);
}

// 2nd: not working
var typex = typeof x === "string";
if (typex) {
  prints(x);
}

第二个变体显示以下错误:

'string | 类型的参数 number' 不可分配给“string”类型的参数。类型“数字”不可分配给类型“字符串”

TS游乐场

标签: javascriptstringtypescripttypeof

解决方案


TypeScript 不够聪明,无法证明x第二个if确实是string. 由于prints只接受 astring并且它不能证明它x是 a string,因此它给出了错误。

第一种情况,类型检查发生在if条件本身内部,因为 TypeScript 有一个特殊情况来理解这种类型检查。但是,理解某个变量中的某些值可以指示某个其他变量的类型,这超出了它可以处理的范围。是的,在这个具体的例子中,它看起来应该是微不足道的,但它很快就会变得非常困难,甚至完全不可能在一般情况下发挥作用。

如果您绝对希望第二种情况起作用,尽管类型检查与 . 是分开的if,您需要通过显式转换值来为 TypeScript 提供额外的信息。例如, using 的prints(x as string)意思是“我保证 is 总是 a string。如果不是,程序爆炸时是我的错。” 这种类型的转换是向 TypeScript 发出的一个信号,即开发人员知道一些它不理解的东西并且盲目地信任它。


推荐阅读