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

Relaterade artiklar