代码如下:
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适用于所有回调方法:
操场