forEach 循环中设置的变量类型错误

烤鱼机

forEach回调函数内部设置变量时,该变量的类型似乎不正确。一个简单的例子:

let foo: (string | null) = null;

[1,2,3].forEach((i) => {
  foo = "bar";
});

if(foo == null) {
    throw new Error("not found")
}

# Typescript complains that `length` is not a property of type `never`
console.log(foo.length)

打字稿游乐场链接

紧接着forEach我希望的类型foostring | null,但实际上只是null. 通过console.log线我希望它只是string,但它实际上是never(因为我们已经消除了null作为与一个可能性Error投掷。

重要的是,上面的代码(减去: (string | null)一点)在纯 JavaScript 中工作得很好 - 这纯粹是我和 TypeScript 编译器以某种方式无法正常通信的情况。

所以无论如何:

  1. 如果有人能解释为什么会这样,以便我可以更好地理解 Typescript,我会很高兴的
  2. 我该如何解决这个问题?我可以foo = foo as string在 console.log 之前打一个耳光,但肯定有更好的方法吗?
奥列格·瓦尔特

这是控制流分析的权衡之一。

通过注释类型,string | null您告诉编译器该变量显然需要任一类型的值。然后对 进行赋值null,让编译器将类型缩小到null

您希望 TypeScript 考虑回调内部的分配并放弃缩小范围,但事实并非如此。这是团队在决定作为参数传递给高阶函数的函数中发生的突变是否应该泄漏到外部作用域时所做的权衡。

请参阅此源代码库讨论。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章