Promise 風な型が持っている型を取得する方法を考える。
type X = Promise<string>; // stringを取り出す。
type Y = Promise<{ field: number }>; // { filed: number } を取り出す
type Z = Promise<Promise<string | number>>; // string | numberを取り出す
最初はこういうことかなと思って、ConditionalTypes の中で infer を利用するような形で解いてみたのですが、Promise<Promise<string | number>>
のように Promise がネストしている場合に引っ掛かりました。
type MyAwaited<T extends Promise<any>> = T extends Promise<infer U> ? U : never;
というわけで再帰的に中を掘っていくやつです。
type MyAwaited<T extends Promise<any>> = T extends Promise<infer U>
? U extends Promise<any>
? MyAwaited<U>
: U
: never;
今回の問題はinfer
にちゃんとたどり着けるかどうかが肝だなと思いました。
ConditionalTypes でネストする場合って、どこで改行するのが正解なんだろうというのは少し疑問です。