Go Back

Refer: Medium - Promise.all

Describe

Type the function PromiseAll that accepts an array of PromiseLike objects, the returning value should be Promise<T> where T is the resolved result array.

code snippetCopytypescript
const promise1 = Promise.resolve(3) const promise2 = 42 const promise3 = new Promise<string>((resolve, reject) => { setTimeout(resolve, 100, 'foo') }) // expected to be `Promise<[number, 42, string]>` const p = Promise.all([promise1, promise2, promise3] as const)

Test Cases

code snippetCopytypescript
import { Equal, Expect } from '@type-challenges/utils' const promiseAllTest1 = PromiseAll([1, 2, 3] as const) const promiseAllTest2 = PromiseAll([1, 2, Promise.resolve(3)] as const) const promiseAllTest3 = PromiseAll([1, 2, Promise.resolve(3)]) type cases = [ Expect<Equal<typeof promiseAllTest1, Promise<[1, 2, 3]>>>, Expect<Equal<typeof promiseAllTest2, Promise<[1, 2, number]>>>, Expect<Equal<typeof promiseAllTest3, Promise<[number, number, number]>>>, ]

Solution

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