为什么回调函数的参数中没有应用类型保护?

问题描述 投票:0回答:1

以下是一个简单的 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 callback typeguards
1个回答
0
投票

发生这种情况的原因是 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

© www.soinside.com 2019 - 2024. All rights reserved.