問題 & 解答
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 でネストする場合って、どこで改行するのが正解なんだろうというのは少し疑問です。