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
