从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
我希望的类型foo
是string | null
,但实际上只是null
. 通过console.log
线我希望它只是string
,但它实际上是never
(因为我们已经消除了null
作为与一个可能性Error
投掷。
重要的是,上面的代码(减去: (string | null)
一点)在纯 JavaScript 中工作得很好 - 这纯粹是我和 TypeScript 编译器以某种方式无法正常通信的情况。
所以无论如何:
foo = foo as string
在 console.log 之前打一个耳光,但肯定有更好的方法吗?这是控制流分析的权衡之一。
通过注释类型,string | null
您告诉编译器该变量显然需要任一类型的值。然后对 进行赋值null
,让编译器将类型缩小到null
。
您希望 TypeScript 考虑回调内部的分配并放弃缩小范围,但事实并非如此。这是团队在决定作为参数传递给高阶函数的函数中发生的突变是否应该泄漏到外部作用域时所做的权衡。
请参阅此源代码库讨论。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句