typescript - Typ av löst löfte
Jag skulle vilja använda returtypen av en funktion för att typa ett objekt på ett gränssnitt på följande sätt:
const returnsPromise = async (): Promise<string> => {
return Promise.resolve('I want the string type and not a Promise')
}
interface Myinterface {
message: ReturnType<typeof returnsPromise>
}Men meddelandet är av typen Promise istället för string. Kan man få typen som ett löfte borde lösa med?
Svar #1
TypeScript 4.5 introducerade typen Awaited<T>, som utvärderas till den typ du får om du await ett värde av typen T. Så du kan skriva:
interface Myinterface {
message: Awaited<ReturnType<typeof returnsPromise>>;
// (property) Myinterface.message: string
}
Om du inte har TypeScript 4.5 än kan du alltid själv "un-Promise" en typ med villkorlig typinferens:
type Unpromise<T> = T extends Promise<infer U> ? U : never;
interface Myinterface {
message: Unpromise<ReturnType<typeof returnsPromise>>;
// (property) Myinterface.message: string
}
De producerar båda string när du matar in Promise<string>. För mer komplicerade typer som nästlade Promise producerar de olika resultat:
type APPs = Awaited<Promise<Promise<string>>>; // type APPs = string
type UPPs = Unpromise<Promise<Promise<string>>>; // type UPPs = Promise<string>
Så det beror på dina användningsfall om du behöver räkna ut "vad ett löfte löses med" rekursivt eller inte.
Lekplatslänk till kod
