typescript - Tipul unei Promisiuni Rezolvate


Aș dori să folosesc tipul de returnare al unei funcții pentru a tipa un element pe o interfață astfel:

const returnsPromise = async (): Promise<string> => {
  return Promise.resolve('I want the string type and not a Promise')
}

interface Myinterface {
  message: ReturnType<typeof returnsPromise>
}

Totuși, mesajul este de tip Promise în loc de string. Se poate afla tipul cu care ar trebui să se rezolve o promisiune?

Răspuns #1

TypeScript 4.5 a introdus tipul Awaited<T>, care evaluează tipul pe care îl obții dacă faci await unui valoare de tip T. Deci ai putea scrie:

interface Myinterface {
  message: Awaited<ReturnType<typeof returnsPromise>>;
  // (property) Myinterface.message: string
}

Dacă nu ai încă TypeScript 4.5, poți întotdeauna să "de-Promise" un tip singur folosind inferența condițională a tipului:

type Unpromise<T> = T extends Promise<infer U> ? U : never;

interface Myinterface {
  message: Unpromise<ReturnType<typeof returnsPromise>>;
  // (property) Myinterface.message: string
}

Ambele produc string atunci când transmiți Promise<string>. Pentru tipuri mai complicate, cum ar fi Promise-urile imbricate, ele produc rezultate diferite:

type APPs = Awaited<Promise<Promise<string>>>; // type APPs = string
type UPPs = Unpromise<Promise<Promise<string>>>; // type UPPs = Promise<string>

Deci depinde de cazurile tale de utilizare dacă trebuie să calculezi „cu ce se rezolvă o promisiune” recursiv sau nu.

Link de teren de joacă către cod