Awaited
Challenge
If we have a type which is wrapped type like Promise. How we can get a type which is inside the wrapped type?
For example: if we have Promise<ExampleType> how to get ExampleType?
type ExampleType = Promise<string>;
type Result = MyAwaited<ExampleType>; // string
This question is ported from the original article by @maciejsikora
Solution
Um an die inneren Typen der Rückgabe eines anderen Typen (zum Beispiel PromiseT entpacken, sodass man aus Promise<string> den Typ string erhielt.
TypeScript bringt von Haus aus bereits eine Möglichkeit mit, Typen in Conditional Types zu inferieren. Man teilt dem Compiler hierdurch mit, dass er sobald er den Context kennt, den richtigen Typ bestimmen soll mehr hier.
Somit kann man einfach folgendes schreiben:
type Awaited<T> = T extends Promise<infer U> ? U : T;
Wichtig ist noch zu beachten, dass der Typ auch für geschachtelte Promises funktionieren soll. Entsprechend muss die Lösung so erweitert werden, dass Falls der inferte Typ ein Promise ist, wird der Typ rekursiv erneut aufgerufen, bis man einen Typ erhaelt, der kein Promise ist:
type MyAwaited<T> = T extends PromiseLike<infer U> ? MyAwaited<U> : T;