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