Skip to content

Commit c2c7c0a

Browse files
authored
Better typings for Promise.all(), etc. like #31117
1 parent 8292af1 commit c2c7c0a

File tree

1 file changed

+16
-22
lines changed

1 file changed

+16
-22
lines changed

Diff for: src/lib/es2015.promise.d.ts

+16-22
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
type Awaited<T> = T extends PromiseLike<infer U> ? U : T;
2+
13
interface PromiseConstructor {
24
/**
35
* A reference to the prototype.
@@ -10,103 +12,95 @@ interface PromiseConstructor {
1012
* a resolve callback used to resolve the promise with a value or the result of another promise,
1113
* and a reject callback used to reject the promise with a provided reason or error.
1214
*/
13-
new <T>(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void): Promise<T>;
15+
new <T>(executor: (resolve: (value?: T) => void, reject: (reason?: any) => void) => void): Promise<Awaited<T>>;
1416

1517
/**
1618
* Creates a Promise that is resolved with an array of results when all of the provided Promises
1719
* resolve, or rejected when any Promise is rejected.
1820
* @param values An array of Promises.
1921
* @returns A new Promise.
2022
*/
21-
all<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(values: readonly [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike <T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>, T9 | PromiseLike<T9>, T10 | PromiseLike<T10>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]>;
23+
all<T extends [any, any, any, any, any, any, any, any, any, any]>(values: T): Promise<{ -readonly [P in keyof T]: Awaited<T[P]> }>;
2224

2325
/**
2426
* Creates a Promise that is resolved with an array of results when all of the provided Promises
2527
* resolve, or rejected when any Promise is rejected.
2628
* @param values An array of Promises.
2729
* @returns A new Promise.
2830
*/
29-
all<T1, T2, T3, T4, T5, T6, T7, T8, T9>(values: readonly [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike <T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>, T9 | PromiseLike<T9>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9]>;
31+
all<T extends [any, any, any, any, any, any, any, any, any]>(values: T): Promise<{ -readonly [P in keyof T]: Awaited<T[P]> }>;
3032

3133
/**
3234
* Creates a Promise that is resolved with an array of results when all of the provided Promises
3335
* resolve, or rejected when any Promise is rejected.
3436
* @param values An array of Promises.
3537
* @returns A new Promise.
3638
*/
37-
all<T1, T2, T3, T4, T5, T6, T7, T8>(values: readonly [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike <T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8]>;
39+
all<T extends [any, any, any, any, any, any, any, any]>(values: T): Promise<{ -readonly [P in keyof T]: Awaited<T[P]> }>;
3840

3941
/**
4042
* Creates a Promise that is resolved with an array of results when all of the provided Promises
4143
* resolve, or rejected when any Promise is rejected.
4244
* @param values An array of Promises.
4345
* @returns A new Promise.
4446
*/
45-
all<T1, T2, T3, T4, T5, T6, T7>(values: readonly [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike <T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>]): Promise<[T1, T2, T3, T4, T5, T6, T7]>;
47+
all<T extends [any, any, any, any, any, any, any]>(values: T): Promise<{ -readonly [P in keyof T]: Awaited<T[P]> }>;
4648

4749
/**
4850
* Creates a Promise that is resolved with an array of results when all of the provided Promises
4951
* resolve, or rejected when any Promise is rejected.
5052
* @param values An array of Promises.
5153
* @returns A new Promise.
5254
*/
53-
all<T1, T2, T3, T4, T5, T6>(values: readonly [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike <T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>]): Promise<[T1, T2, T3, T4, T5, T6]>;
55+
all<T extends [any, any, any, any, any, any]>(values: T): Promise<{ -readonly [P in keyof T]: Awaited<T[P]> }>;
5456

5557
/**
5658
* Creates a Promise that is resolved with an array of results when all of the provided Promises
5759
* resolve, or rejected when any Promise is rejected.
5860
* @param values An array of Promises.
5961
* @returns A new Promise.
6062
*/
61-
all<T1, T2, T3, T4, T5>(values: readonly [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike <T4>, T5 | PromiseLike<T5>]): Promise<[T1, T2, T3, T4, T5]>;
63+
all<T extends [any, any, any, any, any]>(values: T): Promise<{ -readonly [P in keyof T]: Awaited<T[P]> }>;
6264

6365
/**
6466
* Creates a Promise that is resolved with an array of results when all of the provided Promises
6567
* resolve, or rejected when any Promise is rejected.
6668
* @param values An array of Promises.
6769
* @returns A new Promise.
6870
*/
69-
all<T1, T2, T3, T4>(values: readonly [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike <T4>]): Promise<[T1, T2, T3, T4]>;
71+
all<T extends [any, any, any, any]>(values: T): Promise<{ -readonly [P in keyof T]: Awaited<T[P]> }>;
7072

7173
/**
7274
* Creates a Promise that is resolved with an array of results when all of the provided Promises
7375
* resolve, or rejected when any Promise is rejected.
7476
* @param values An array of Promises.
7577
* @returns A new Promise.
7678
*/
77-
all<T1, T2, T3>(values: readonly [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>]): Promise<[T1, T2, T3]>;
79+
all<T extends [any, any, any]>(values: T): Promise<{ -readonly [P in keyof T]: Awaited<T[P]> }>;
7880

7981
/**
8082
* Creates a Promise that is resolved with an array of results when all of the provided Promises
8183
* resolve, or rejected when any Promise is rejected.
8284
* @param values An array of Promises.
8385
* @returns A new Promise.
8486
*/
85-
all<T1, T2>(values: readonly [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>]): Promise<[T1, T2]>;
87+
all<T extends [any, any]>(values: T): Promise<{ -readonly [P in keyof T]: Awaited<T[P]> }>;
8688

8789
/**
8890
* Creates a Promise that is resolved with an array of results when all of the provided Promises
8991
* resolve, or rejected when any Promise is rejected.
9092
* @param values An array of Promises.
9193
* @returns A new Promise.
9294
*/
93-
all<T>(values: readonly (T | PromiseLike<T>)[]): Promise<T[]>;
94-
95-
/**
96-
* Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
97-
* or rejected.
98-
* @param values An array of Promises.
99-
* @returns A new Promise.
100-
*/
101-
race<T>(values: readonly T[]): Promise<T extends PromiseLike<infer U> ? U : T>;
95+
all<T extends readonly any[]>(values: T): Promise<{ -readonly [P in keyof T]: Awaited<T[P]> }>;
10296

10397
/**
10498
* Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
10599
* or rejected.
106100
* @param values An iterable of Promises.
107101
* @returns A new Promise.
108102
*/
109-
race<T>(values: Iterable<T>): Promise<T extends PromiseLike<infer U> ? U : T>;
103+
race<T>(values: Iterable<T>): Promise<Awaited<T>>;
110104

111105
/**
112106
* Creates a new rejected promise for the provided reason.
@@ -120,10 +114,10 @@ interface PromiseConstructor {
120114
* @param value A promise.
121115
* @returns A promise whose internal state matches the provided promise.
122116
*/
123-
resolve<T>(value: T | PromiseLike<T>): Promise<T>;
117+
resolve<T>(value: T): Promise<Awaited<T>>;
124118

125119
/**
126-
* Creates a new resolved promise .
120+
* Creates a new resolved promise.
127121
* @returns A resolved promise.
128122
*/
129123
resolve(): Promise<void>;

0 commit comments

Comments
 (0)