ikuma-t.

検索

type-challenges 6日目: 189-Awaited

に公開

問題 & 解答

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

ikuma-t

ikuma-t

ABOUT

9割笑顔、1割 (´・ω・) なエンジニア