type-challenges 19日目:20-Promise.all

問題 & 解答

https://github.com/type-challenges/type-challenges/blob/main/questions/00020-medium-promise-all/README.md

PromiseAllに型をつける。

declare function PromiseAll<T extends any[]>(values: readonly [...T]): Promise<{
  [P in keyof T]: T[P] extends Promise<infer R> ? R: T[P]
}>

問題文にもありますが、PromiseAllの戻り値の型はPromise<T>で、引数の型は配列です。as constが使用されているケースがあるので、ここまでで

declare function PromiseAll<T extends any[]>(values: readonly [...T]): Promise<T>

こういう感じです。あとはどっかの回でやった再帰的なやつにやや近いですが、TがPromiseだった場合にはそれを解除してやる必要があるので、mappedTypesとinferキーワードを使って最終的にはこうなります。

declare function PromiseAll<T extends any[]>(values: readonly [...T]): Promise<{
  [P in keyof T]: T[P] extends Promise<infer R> ? R: T[P]
}>

感想

眠いです笑


Buy Me A Coffeeikuma-tにお恵みを!