The code is as follows:
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
I remember that TypeScript supported this feature a long time ago. I'm not sure whether it is still available now?
CodePudding user response:
Since you are already checking if (obj.a), TypeScript will not complain that obj.a can be undefined.
What are you trying to achieve by the way? Usually the usage of delete is not really recommended, there should be a better way.
CodePudding user response:
This is a TOCTOU bug:
async function test() {
if (obj.a) {
await delay(1000);
obj.a() // want an obj.a may be undefined error
delete obj.a
}
}
A better way to write it is not to check at all, but to only invoke obj.a if it exists using the Optional chaining operator (?.):
async function test() {
await delay(1000);
obj.a?.() // possibly undefined, but only invoke if exists
delete obj.a
}
