javascript - Hur man kastar bort Promise-typen i TypeScript?
Jag använder TypeScript och jag har följande löfteskedja:
function bar(): Promise<boolean> {
globalVar = doSomething();
return Promise.resolve(true);
}
return foo()
.then(() => {
return bar();
}).then(() => {
return bas();
}
I de flesta fall behöver jag returvärdet av bas, men i ett fall behöver jag det inte. Vad är det bästa sättet att kassera boolean-typen? Jag försökte en typkonvertering som as Promise<void> men det fungerar inte eftersom typerna void och boolean inte överlappar.
Här är ett minimalt MVCE:
let globalVar: string = 'hello';
function bar(): Promise<boolean> {
globalVar = 'world';
return Promise.resolve(true);
}
function xyz(): Promise<void> {
return bar();
}
TS Lekplats
Svar #1
Detta är en långvarig bugg i TypeScript; se microsoft/TypeScript#12871. Den är listad som att vara på "Backlog", så jag skulle inte förvänta mig att se en lösning inom en snar framtid om jag vore du. Det enklaste sättet att hantera detta är helt enkelt att använda en typindikation (det du kallar en "cast") för att undertrycka felet:
function xyz(): Promise<void> {
return bar() as Promise<any> as Promise<void>;
}
felet på bar() as Promise<void> beror bara på att kompilatorn inte ser dem som tillräckligt relaterade för att göra en assertion; allt du behöver göra är att göra en assertion till någon mellanliggande typ som ses som relaterad till båda.
Denna förändring har fördelen att lämna den utsläppta JavaScript-koden oförändrad.
En annan lösning är att använda en tom then(), som inte ändrar den returnerade promise (det kommer fortfarande att vara en boolean vid körning) men kompilatorn ser det som Promise<void>:
function uvw(): Promise<void> {
return bar().then()
}
Eller så kan du uttryckligen se till att det inte finns något returvärde vid körning också:
function rst(): Promise<void> {
return bar().then(() => { })
}
Men båda dessa är bara körning-synliga lösningar för en bugg i TS-kompilatorn, så jag vet inte om jag rekommenderar dem.
Playground-länk till kod
Svar #2
Du kan helt enkelt lägga till en .then efter din bar() som inte returnerar något:
let globalVar: string = 'hello';
function bar(): Promise<boolean> {
globalVar = 'world';
return Promise.resolve(true);
}
function xyz(): Promise<void> {
return bar().then(() => undefined);
/*
// other possible callbacks
return bar().then(() => {});
return bar().then(() => {
return;
});
*/
}
Med await/async skulle det se bättre ut:
let globalVar: string = 'hello';
function bar(): Promise<boolean> {
globalVar = 'world';
return Promise.resolve(true);
}
async function xyz(): Promise<void> {
await bar()
}
