尽管有类型防护,打字稿仍会引发“对象可能为'null'”错误

时间:2018-09-10 19:56:12

标签: typescript types null

我有一个我不应该理解的打字稿行为,我希望得到您的投入。

即使之前进行类型检查,编译器也会向我抛出“ 对象可能为'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
}

那么,即使捕获的 if 对其进行了检查,为什么我访问函数调用中可能为null的属性时,编译器还会警告我呢?

谢谢!

1 个答案:

答案 0 :(得分:6)

这是设计使然。 TypeScript不假定类型防护在回调中保持活动状态,因为这样做很危险。

修复

在本地捕获变量以确保它不会在外部被更改,并且TypeScript可以轻松理解。

if (foo.bar) {
  const bar = foo.bar;
  functionDoingSomeStuff(() => {
    console.log(bar.a) // no compiler error
  })
}