有时我会偶然发现:
if (obj.needle) { // obj = { needle?: string }
console.log(obj.needle) // no error here
matches((haystack) => {
return haystack.needle === obj.needle // Error: Object is possibly 'undefined'.
})
}
似乎 TypeScript 需要在回调函数中进行另一次检查。我想知道 a)为什么?和 b)如何优雅地解决这个问题 - 无需再次检查,因为它不是异步函数,也没有办法obj.needle
突然出现'undefined'
。
Typescript 不知道matches
仅在obj
定义时调用此回调。据 TS 所知,matches
可以挂在该函数上并在以后的某个随机时间调用它,obj
什么时候都可以。或者matches
也可以obj
在调用回调之前改变自身。obj
据 TS 所知,在调用此回调之前,有很多方法可以更改。
有几种可能的解决方案。一行修复只是创建 TS 知道无法更改的对象的常量副本:
if (obj.needle) { // obj = { needle?: string }
console.log(obj.needle) // no error here
const constObj = obj
matches((haystack) => {
return haystack.needle === constObj.needle
})
}
另一种选择是创建一个生成回调的函数(本质上是相同的,但代码多一点):
const createMatcher = obj => haystack => {
return haystack.needle === obj
}
if (obj?.needle) { // obj = { needle?: string }
console.log(obj.needle) // no error here
matches(createMatcher(obj))
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句