在已启用的TypeScript 中strict
(TypeScript Playground):
type Foo = { a: number; b: number; }
class Bar {
#a?: Foo;
bar() {
const a = this.#a?.a;
if (!a) {return;}
// Error: Object is possibly 'undefined'.
const b = this.#a.b;
}
bar2() {
const obj = this.#getFoo();
const a = obj?.a;
if (!a) {return;}
// No error:
const b = obj.b;
console.log(b);
}
#getFoo() : Foo | undefined {
return undefined;
}
}
为什么TS理解正确的是bar2()
不可能;但不是在?我缺少逻辑案例吗?obj.b
undefined
this.#a.b
bar()
在 中bar()
,如果我分配const tmp = this.#a
它也能成功编译。
更新:显然它与变量的可变性有关。如果我使用,错误也会let obj = this.#getFoo()
出现。obj
ts 编译器不能保证
this.#a
两次属性访问之间的值不会改变,因为 TypeScript 假设类属性的值可以随时改变,即使在连续的两行代码之间也是如此,即 TypeScript 不能确保 的值this.#a
仍然是原来的值。两条线之间相同。在该
bar2()
方法中, obj 的值被赋值给 的结果this.#getFoo()
,这是一个局部变量。TypeScript 可以保证 obj 的值在两次属性访问之间不会改变,因此它不会抱怨。在上次更新中,当您使用时
let obj = this.#getFoo()
,TypeScript 假定 obj 的值可能会在两个属性访问之间发生更改,因为它是可变的。结果,错误obj
也出现了。现在,要解决这个问题,您可以分配
this.#a
给局部常量变量。就像是:打字游乐场
上下文参考