typescript - Ersätt fälttyper i gränssnitt med promises


Typescript har typen Partial<Object> som hjälper till att göra alla fält i ett objekt valfria.

Är det möjligt på samma sätt att skapa en generisk typ Promisify<Person> som kommer att ändra Person-typen från:

interface Person {
  getName(): string;
  getAge(): number;
}

till :

interface PromisifyPerson {
  getName(): Promise<string>;
  getAge(): Promise<number>;
}

Jag har ett synkront API beskrivet via Typescript-gränssnitt och mitt mål är att skapa en asynkron version av API:et utan att skriva om alla gränssnitt som jag har. Detta är ett annat exempel:

interface ApplicationApi {
  startApp(): void;
  readFile(fileName): string; 
}

type AsyncApplicationAPI = Async<ApplicationApi>

efter det förväntar jag mig att AsyncApplicationAPI bör vara något som:

interface AsyncApplicationApi {
  startApp(): Promise<void>;
  readFile(fileName): Promise<string>; 
}

Svar #1

type Promisified<T> = {
    [K in keyof T]: T[K] extends (...args: any) => infer R ? 
        (...args: Parameters<T[K]>) => Promise<R> :
        T;
}

Eller se här.

Svar #2

Jag är säker på att du skulle kunna skapa det, även om det kan ta lite arbete. Du skulle helt enkelt kunna skapa en funktion som itererar över varje egenskap hos det givna objektet och returnerar ett objekt som är identiskt förutom att datamedlemmarna är omslutna i Promises och funktionerna omslutna i nya funktioner som returnerar promises. Självklart skulle du behöva tänka på detaljer, som om du ville att alla objektets egenskapers egenskaper ska omslutas i promises eller inte...

redigera: mitt svar skulle göra det så att du kunde skicka ett instans av ett objekt och få tillbaka en promisifierad instans. Du kanske inte kan göra det för typer i allmänhet från själva språket.

Relaterade artiklar