在 TypeScript 中,异步操作后如何使真值断言无效?



代码如下:

function delay(ms: number) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
const obj: { a?: () => any } = {
a: () => {},
};
async function test() {
if (obj.a) { 
await delay(1000);
obj.a() // want an obj.a may be undefined error
delete obj.a
}
}
test()
test() // TypeError: obj.a is not a function

我记得TypeScript很久以前就支持这个功能。我不确定它现在是否仍然可用?

由于您已经在检查if (obj.a),TypeScript 不会抱怨obj.a可以未定义。

顺便说一下,你想实现什么?通常不建议使用删除,应该有更好的方法。

这是一个TOCTOU错误:

TS游乐场

async function test() {
if (obj.a) { 
await delay(1000);
obj.a() // want an obj.a may be undefined error
delete obj.a
}
}

更好的编写方法是根本不检查,而只是使用 Optional 链接运算符 (?.) 调用obj.a如果存在:

TS游乐场

async function test() {
await delay(1000);
obj.a?.() // possibly undefined, but only invoke if exists
delete obj.a
}

我想起来了!

我以前在 setTimeout 上有过类型警告,所以我认为是 ts 检查所有异步方法。

我今天刚刚了解到ts适用于所有回调方法:

操场

最新更新