以下是一个简单的 TypeScript 代码示例。
// Example Setup
declare var foo:{bar?: {baz: string}};
function immediate(callback: () => void) {
callback();
}
// Type Guard
if (foo.bar) {
console.log(foo.bar.baz); // ✅ It works!
immediate(() => {
console.log(foo.bar.baz); // ❌ TS error : 'foo.bar' is possibly 'undefined'.(18048)
});
}
foo.bar
有类型保护以确保它不是空值,事实上,foo.bar
被推断为 {baz: string}
类型。
但是,我不知道为什么立即回调函数中会出现 TypeScript 错误,说
foo.bar
可能未定义。是什么原因导致这个错误?
发生这种情况的原因是 TypeScript 不知道回调函数何时被调用,因此它不知道类型缩小是否仍然有效。任何任意代码都可以在其间运行并对
foo
进行更改。
最简单的解决方案是将您要检查的内容分配给
const
。这样,打字稿就知道它无法更改,因此类型缩小必须仍然有效。
const temp = foo.bar;
if (temp) {
console.log(temp.baz);
immediate(() => {
console.log(temp.baz);
});
}
PS,TypeScript 5.4 版本(在撰写本文时处于测试阶段)改进了对这些情况的处理,因此您可能不需要长期使用该解决方法。有关更多信息,请参阅:https://devblogs.microsoft.com/typescript/announcing-typescript-5-4-beta/#preserved-narrowing-in-closures-following-last-assignments