谁能解释为什么第二个变体不起作用?是bug吗?
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' 的参数。 类型 'number' 不能分配给类型 'string'
答案 0 :(得分:2)
TypeScript 不够智能,无法证明第二个 x
中的 if
确实是 string
。由于 prints
只接受一个 string
并且它不能证明 x
是一个 string
,所以它给出了一个错误。
第一种情况,类型检查发生在 if
条件本身内部,因为 TypeScript 有 a special case for understanding that kind of type check。然而,理解某个变量中的某些值可以指示某个其他变量的类型是它无法处理的。是的,在这个特定的例子中,看起来应该很容易弄清楚,但它很快就会变得非常困难,甚至在一般情况下完全不可能发挥作用。
如果您绝对希望第二种情况起作用,尽管类型检查与 if
是分开的,您需要通过显式转换值来为 TypeScript 提供额外信息。例如,使用 prints(x as string)
的意思是“我保证它总是一个 string
。如果不是,当程序爆炸时这是我的错。”这种类型的转换是给 TypeScript 的一个信号,表明开发人员知道一些它不理解的东西并盲目信任它。
答案 1 :(得分:0)
正如评论中已经提到的,问题已经存在于 github
:
Indirect type narrowing via const 和 allow storing results of narrowing in booleans for further narrowing