Skip to content

Commit 1d79d5d

Browse files
committed
Better typings for Promise.all(), like microsoft#31117
Fixes microsoft#28427
1 parent effde01 commit 1d79d5d

20 files changed

+120
-120
lines changed

src/lib/es2015.iterable.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ interface PromiseConstructor {
203203
* @param values An array of Promises.
204204
* @returns A new Promise.
205205
*/
206-
all<TAll>(values: Iterable<TAll | PromiseLike<TAll>>): Promise<TAll[]>;
206+
all<TAll>(values: Iterable<TAll>): Promise<(TAll extends PromiseLike<infer UAll> ? UAll : TAll)[]>;
207207
}
208208

209209
declare namespace Reflect {

src/lib/es2015.promise.d.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,79 +18,79 @@ interface PromiseConstructor {
1818
* @param values An array of Promises.
1919
* @returns A new Promise.
2020
*/
21-
all<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(values: [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]>;
21+
all<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(values: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]): Promise<[T1 extends PromiseLike<infer U1> ? U1 : T1, T2 extends PromiseLike<infer U2> ? U2 : T2, T3 extends PromiseLike<infer U3> ? U3 : T3, T4 extends PromiseLike<infer U4> ? U4 : T4, T5 extends PromiseLike<infer U5> ? U5 : T5, T6 extends PromiseLike<infer U6> ? U6 : T6, T7 extends PromiseLike<infer U7> ? U7 : T7, T8 extends PromiseLike<infer U8> ? U8 : T8, T9 extends PromiseLike<infer U9> ? U9 : T9, T10 extends PromiseLike<infer U10> ? U10 : T10]>;
2222

2323
/**
2424
* Creates a Promise that is resolved with an array of results when all of the provided Promises
2525
* resolve, or rejected when any Promise is rejected.
2626
* @param values An array of Promises.
2727
* @returns A new Promise.
2828
*/
29-
all<T1, T2, T3, T4, T5, T6, T7, T8, T9>(values: [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]>;
29+
all<T1, T2, T3, T4, T5, T6, T7, T8, T9>(values: [T1, T2, T3, T4, T5, T6, T7, T8, T9]): Promise<[T1 extends PromiseLike<infer U1> ? U1 : T1, T2 extends PromiseLike<infer U2> ? U2 : T2, T3 extends PromiseLike<infer U3> ? U3 : T3, T4 extends PromiseLike<infer U4> ? U4 : T4, T5 extends PromiseLike<infer U5> ? U5 : T5, T6 extends PromiseLike<infer U6> ? U6 : T6, T7 extends PromiseLike<infer U7> ? U7 : T7, T8 extends PromiseLike<infer U8> ? U8 : T8, T9 extends PromiseLike<infer U9> ? U9 : T9]>;
3030

3131
/**
3232
* Creates a Promise that is resolved with an array of results when all of the provided Promises
3333
* resolve, or rejected when any Promise is rejected.
3434
* @param values An array of Promises.
3535
* @returns A new Promise.
3636
*/
37-
all<T1, T2, T3, T4, T5, T6, T7, T8>(values: [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]>;
37+
all<T1, T2, T3, T4, T5, T6, T7, T8>(values: [T1, T2, T3, T4, T5, T6, T7, T8]): Promise<[T1 extends PromiseLike<infer U1> ? U1 : T1, T2 extends PromiseLike<infer U2> ? U2 : T2, T3 extends PromiseLike<infer U3> ? U3 : T3, T4 extends PromiseLike<infer U4> ? U4 : T4, T5 extends PromiseLike<infer U5> ? U5 : T5, T6 extends PromiseLike<infer U6> ? U6 : T6, T7 extends PromiseLike<infer U7> ? U7 : T7, T8 extends PromiseLike<infer U8> ? U8 : T8]>;
3838

3939
/**
4040
* Creates a Promise that is resolved with an array of results when all of the provided Promises
4141
* resolve, or rejected when any Promise is rejected.
4242
* @param values An array of Promises.
4343
* @returns A new Promise.
4444
*/
45-
all<T1, T2, T3, T4, T5, T6, T7>(values: [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]>;
45+
all<T1, T2, T3, T4, T5, T6, T7>(values: [T1, T2, T3, T4, T5, T6, T7]): Promise<[T1 extends PromiseLike<infer U1> ? U1 : T1, T2 extends PromiseLike<infer U2> ? U2 : T2, T3 extends PromiseLike<infer U3> ? U3 : T3, T4 extends PromiseLike<infer U4> ? U4 : T4, T5 extends PromiseLike<infer U5> ? U5 : T5, T6 extends PromiseLike<infer U6> ? U6 : T6, T7 extends PromiseLike<infer U7> ? U7 : T7]>;
4646

4747
/**
4848
* Creates a Promise that is resolved with an array of results when all of the provided Promises
4949
* resolve, or rejected when any Promise is rejected.
5050
* @param values An array of Promises.
5151
* @returns A new Promise.
5252
*/
53-
all<T1, T2, T3, T4, T5, T6>(values: [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]>;
53+
all<T1, T2, T3, T4, T5, T6>(values: [T1, T2, T3, T4, T5, T6]): Promise<[T1 extends PromiseLike<infer U1> ? U1 : T1, T2 extends PromiseLike<infer U2> ? U2 : T2, T3 extends PromiseLike<infer U3> ? U3 : T3, T4 extends PromiseLike<infer U4> ? U4 : T4, T5 extends PromiseLike<infer U5> ? U5 : T5, T6 extends PromiseLike<infer U6> ? U6 : T6]>;
5454

5555
/**
5656
* Creates a Promise that is resolved with an array of results when all of the provided Promises
5757
* resolve, or rejected when any Promise is rejected.
5858
* @param values An array of Promises.
5959
* @returns A new Promise.
6060
*/
61-
all<T1, T2, T3, T4, T5>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike <T4>, T5 | PromiseLike<T5>]): Promise<[T1, T2, T3, T4, T5]>;
61+
all<T1, T2, T3, T4, T5>(values: [T1, T2, T3, T4, T5]): Promise<[T1 extends PromiseLike<infer U1> ? U1 : T1, T2 extends PromiseLike<infer U2> ? U2 : T2, T3 extends PromiseLike<infer U3> ? U3 : T3, T4 extends PromiseLike<infer U4> ? U4 : T4, T5 extends PromiseLike<infer U5> ? U5 : T5]>;
6262

6363
/**
6464
* Creates a Promise that is resolved with an array of results when all of the provided Promises
6565
* resolve, or rejected when any Promise is rejected.
6666
* @param values An array of Promises.
6767
* @returns A new Promise.
6868
*/
69-
all<T1, T2, T3, T4>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike <T4>]): Promise<[T1, T2, T3, T4]>;
69+
all<T1, T2, T3, T4>(values: [T1, T2, T3, T4]): Promise<[T1 extends PromiseLike<infer U1> ? U1 : T1, T2 extends PromiseLike<infer U2> ? U2 : T2, T3 extends PromiseLike<infer U3> ? U3 : T3, T4 extends PromiseLike<infer U4> ? U4 : T4]>;
7070

7171
/**
7272
* Creates a Promise that is resolved with an array of results when all of the provided Promises
7373
* resolve, or rejected when any Promise is rejected.
7474
* @param values An array of Promises.
7575
* @returns A new Promise.
7676
*/
77-
all<T1, T2, T3>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>]): Promise<[T1, T2, T3]>;
77+
all<T1, T2, T3>(values: [T1, T2, T3]): Promise<[T1 extends PromiseLike<infer U1> ? U1 : T1, T2 extends PromiseLike<infer U2> ? U2 : T2, T3 extends PromiseLike<infer U3> ? U3 : T3]>;
7878

7979
/**
8080
* Creates a Promise that is resolved with an array of results when all of the provided Promises
8181
* resolve, or rejected when any Promise is rejected.
8282
* @param values An array of Promises.
8383
* @returns A new Promise.
8484
*/
85-
all<T1, T2>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>]): Promise<[T1, T2]>;
85+
all<T1, T2>(values: [T1, T2]): Promise<[T1 extends PromiseLike<infer U1> ? U1 : T1, T2 extends PromiseLike<infer U2> ? U2 : T2]>;
8686

8787
/**
8888
* Creates a Promise that is resolved with an array of results when all of the provided Promises
8989
* resolve, or rejected when any Promise is rejected.
9090
* @param values An array of Promises.
9191
* @returns A new Promise.
9292
*/
93-
all<T>(values: (T | PromiseLike<T>)[]): Promise<T[]>;
93+
all<T>(values: T[]): Promise<(T extends PromiseLike<infer U> ? U : T)[]>;
9494

9595
/**
9696
* Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
@@ -120,7 +120,7 @@ interface PromiseConstructor {
120120
* @param value A promise.
121121
* @returns A promise whose internal state matches the provided promise.
122122
*/
123-
resolve<T>(value: T | PromiseLike<T>): Promise<T>;
123+
resolve<T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>;
124124

125125
/**
126126
* Creates a new resolved promise .

tests/baselines/reference/asyncArrowFunction11_es5.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ class A {
1111
await Promise.resolve();
1212
>await Promise.resolve() : void
1313
>Promise.resolve() : Promise<void>
14-
>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
14+
>Promise.resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
1515
>Promise : PromiseConstructor
16-
>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
16+
>resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
1717

1818
const obj = { ["a"]: () => this }; // computed property name after `await` triggers case
1919
>obj : { ["a"]: () => this; }

tests/baselines/reference/asyncFunctionReturnType.types

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ async function fIndexedTypeForPromiseOfStringProp(obj: Obj): Promise<Obj["string
4444

4545
return Promise.resolve(obj.stringProp);
4646
>Promise.resolve(obj.stringProp) : Promise<string>
47-
>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
47+
>Promise.resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
4848
>Promise : PromiseConstructor
49-
>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
49+
>resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
5050
>obj.stringProp : string
5151
>obj : Obj
5252
>stringProp : string
@@ -58,9 +58,9 @@ async function fIndexedTypeForExplicitPromiseOfStringProp(obj: Obj): Promise<Obj
5858

5959
return Promise.resolve<Obj["stringProp"]>(obj.stringProp);
6060
>Promise.resolve<Obj["stringProp"]>(obj.stringProp) : Promise<string>
61-
>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
61+
>Promise.resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
6262
>Promise : PromiseConstructor
63-
>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
63+
>resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
6464
>obj.stringProp : string
6565
>obj : Obj
6666
>stringProp : string
@@ -82,9 +82,9 @@ async function fIndexedTypeForPromiseOfAnyProp(obj: Obj): Promise<Obj["anyProp"]
8282

8383
return Promise.resolve(obj.anyProp);
8484
>Promise.resolve(obj.anyProp) : Promise<any>
85-
>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
85+
>Promise.resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
8686
>Promise : PromiseConstructor
87-
>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
87+
>resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
8888
>obj.anyProp : any
8989
>obj : Obj
9090
>anyProp : any
@@ -96,9 +96,9 @@ async function fIndexedTypeForExplicitPromiseOfAnyProp(obj: Obj): Promise<Obj["a
9696

9797
return Promise.resolve<Obj["anyProp"]>(obj.anyProp);
9898
>Promise.resolve<Obj["anyProp"]>(obj.anyProp) : Promise<any>
99-
>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
99+
>Promise.resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
100100
>Promise : PromiseConstructor
101-
>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
101+
>resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
102102
>obj.anyProp : any
103103
>obj : Obj
104104
>anyProp : any
@@ -120,9 +120,9 @@ async function fGenericIndexedTypeForPromiseOfStringProp<TObj extends Obj>(obj:
120120

121121
return Promise.resolve(obj.stringProp);
122122
>Promise.resolve(obj.stringProp) : Promise<string>
123-
>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
123+
>Promise.resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
124124
>Promise : PromiseConstructor
125-
>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
125+
>resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
126126
>obj.stringProp : string
127127
>obj : TObj
128128
>stringProp : string
@@ -133,10 +133,10 @@ async function fGenericIndexedTypeForExplicitPromiseOfStringProp<TObj extends Ob
133133
>obj : TObj
134134

135135
return Promise.resolve<TObj["stringProp"]>(obj.stringProp);
136-
>Promise.resolve<TObj["stringProp"]>(obj.stringProp) : Promise<TObj["stringProp"]>
137-
>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
136+
>Promise.resolve<TObj["stringProp"]>(obj.stringProp) : Promise<TObj["stringProp"] extends PromiseLike<infer U> ? U : TObj["stringProp"]>
137+
>Promise.resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
138138
>Promise : PromiseConstructor
139-
>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
139+
>resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
140140
>obj.stringProp : string
141141
>obj : TObj
142142
>stringProp : string
@@ -158,9 +158,9 @@ async function fGenericIndexedTypeForPromiseOfAnyProp<TObj extends Obj>(obj: TOb
158158

159159
return Promise.resolve(obj.anyProp);
160160
>Promise.resolve(obj.anyProp) : Promise<any>
161-
>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
161+
>Promise.resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
162162
>Promise : PromiseConstructor
163-
>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
163+
>resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
164164
>obj.anyProp : any
165165
>obj : TObj
166166
>anyProp : any
@@ -171,10 +171,10 @@ async function fGenericIndexedTypeForExplicitPromiseOfAnyProp<TObj extends Obj>(
171171
>obj : TObj
172172

173173
return Promise.resolve<TObj["anyProp"]>(obj.anyProp);
174-
>Promise.resolve<TObj["anyProp"]>(obj.anyProp) : Promise<TObj["anyProp"]>
175-
>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
174+
>Promise.resolve<TObj["anyProp"]>(obj.anyProp) : Promise<TObj["anyProp"] extends PromiseLike<infer U> ? U : TObj["anyProp"]>
175+
>Promise.resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
176176
>Promise : PromiseConstructor
177-
>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
177+
>resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
178178
>obj.anyProp : any
179179
>obj : TObj
180180
>anyProp : any
@@ -197,10 +197,10 @@ async function fGenericIndexedTypeForPromiseOfKProp<TObj extends Obj, K extends
197197
>key : K
198198

199199
return Promise.resolve(obj[key]);
200-
>Promise.resolve(obj[key]) : Promise<TObj[K]>
201-
>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
200+
>Promise.resolve(obj[key]) : Promise<TObj[K] extends PromiseLike<infer U> ? U : TObj[K]>
201+
>Promise.resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
202202
>Promise : PromiseConstructor
203-
>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
203+
>resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
204204
>obj[key] : TObj[K]
205205
>obj : TObj
206206
>key : K
@@ -212,10 +212,10 @@ async function fGenericIndexedTypeForExplicitPromiseOfKProp<TObj extends Obj, K
212212
>key : K
213213

214214
return Promise.resolve<TObj[K]>(obj[key]);
215-
>Promise.resolve<TObj[K]>(obj[key]) : Promise<TObj[K]>
216-
>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
215+
>Promise.resolve<TObj[K]>(obj[key]) : Promise<TObj[K] extends PromiseLike<infer U> ? U : TObj[K]>
216+
>Promise.resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
217217
>Promise : PromiseConstructor
218-
>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
218+
>resolve : { <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; (): Promise<void>; }
219219
>obj[key] : TObj[K]
220220
>obj : TObj
221221
>key : K

0 commit comments

Comments
 (0)