我有一个我不会取消的 Typescript 行为,我希望得到您的意见。
编译器向我抛出">对象可能是'null'"错误,即使之前有类型检查。
下面是一个简化的示例:
class Bar {
public a: string
}
class Foo {
public bar: Bar | null
}
function functionDoingSomeStuff(callback: any) {
callback()
}
const foo = new Foo()
if (!foo.bar) {
return new Error()
}
console.log(foo.bar.a) // no compiler error thanks to the previous if
if (foo.bar) {
functionDoingSomeStuff(() => {
console.log(foo.bar.a) // a compiler error
})
console.log(foo.bar.a) // no compiler error
}
那么,如果我访问函数调用中的可能为 null 属性,编译器为什么会警告我,即使捕获if检查了它?
提前感谢!
这是设计使然。TypeScript 不假设类型保护在回调中保持活动状态,因为做出这种假设是危险的。
修复
在本地捕获变量以确保它不会在外部更改,TypeScript 可以轻松理解这一点。
if (foo.bar) {
const bar = foo.bar;
functionDoingSomeStuff(() => {
console.log(bar.a) // no compiler error
})
}