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]
}>
眠いです笑