Skip to content

Commit e3522fd

Browse files
committed
Use conditional type inference for promise resolution
This improves the quality of the type resolution for promise constructor methods, as using conditional type inference is distributive, whereas the inference provided by arguments is not. Alternatively, the arguments based inference could be improved, but that would be a completely different kind of change.
1 parent 5d3685d commit e3522fd

File tree

2 files changed

+27
-22
lines changed

2 files changed

+27
-22
lines changed

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

+22-22
Original file line numberDiff line numberDiff line change
@@ -10,167 +10,167 @@ interface PromiseConstructor {
1010
* a resolve callback used to resolve the promise with a value or the result of another promise,
1111
* and a reject callback used to reject the promise with a provided reason or error.
1212
*/
13-
new <T>(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void): Promise<T>;
13+
new <T>(executor: (resolve: (value?: T) => void, reject: (reason?: any) => void) => void): Promise<ResolveType<T>>;
1414

1515
/**
1616
* Creates a Promise that is resolved with an array of results when all of the provided Promises
1717
* resolve, or rejected when any Promise is rejected.
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<[ResolveType<T1>, ResolveType<T2>, ResolveType<T3>, ResolveType<T4>, ResolveType<T5>, ResolveType<T6>, ResolveType<T7>, ResolveType<T8>, ResolveType<T9>, ResolveType<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<[ResolveType<T1>, ResolveType<T2>, ResolveType<T3>, ResolveType<T4>, ResolveType<T5>, ResolveType<T6>, ResolveType<T7>, ResolveType<T8>, ResolveType<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<[ResolveType<T1>, ResolveType<T2>, ResolveType<T3>, ResolveType<T4>, ResolveType<T5>, ResolveType<T6>, ResolveType<T7>, ResolveType<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<[ResolveType<T1>, ResolveType<T2>, ResolveType<T3>, ResolveType<T4>, ResolveType<T5>, ResolveType<T6>, ResolveType<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<[ResolveType<T1>, ResolveType<T2>, ResolveType<T3>, ResolveType<T4>, ResolveType<T5>, ResolveType<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<[ResolveType<T1>, ResolveType<T2>, ResolveType<T3>, ResolveType<T4>, ResolveType<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<[ResolveType<T1>, ResolveType<T2>, ResolveType<T3>, ResolveType<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<[ResolveType<T1>, ResolveType<T2>, ResolveType<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<[ResolveType<T1>, ResolveType<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: ReadonlyArray<T>): Promise<ResolveType<T>[]>;
9494

9595
/**
9696
* Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
9797
* or rejected.
9898
* @param values An array of Promises.
9999
* @returns A new Promise.
100100
*/
101-
race<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>;
101+
race<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(values: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]): Promise<ResolveType<T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9 | T10>>;
102102

103103
/**
104104
* Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
105105
* or rejected.
106106
* @param values An array of Promises.
107107
* @returns A new Promise.
108108
*/
109-
race<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>;
109+
race<T1, T2, T3, T4, T5, T6, T7, T8, T9>(values: [T1, T2, T3, T4, T5, T6, T7, T8, T9]): Promise<ResolveType<T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9>>;
110110

111111
/**
112112
* Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
113113
* or rejected.
114114
* @param values An array of Promises.
115115
* @returns A new Promise.
116116
*/
117-
race<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>;
117+
race<T1, T2, T3, T4, T5, T6, T7, T8>(values: [T1, T2, T3, T4, T5, T6, T7, T8]): Promise<ResolveType<T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8>>;
118118

119119
/**
120120
* Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
121121
* or rejected.
122122
* @param values An array of Promises.
123123
* @returns A new Promise.
124124
*/
125-
race<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>;
125+
race<T1, T2, T3, T4, T5, T6, T7>(values: [T1, T2, T3, T4, T5, T6, T7]): Promise<ResolveType<T1 | T2 | T3 | T4 | T5 | T6 | T7>>;
126126

127127
/**
128128
* Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
129129
* or rejected.
130130
* @param values An array of Promises.
131131
* @returns A new Promise.
132132
*/
133-
race<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>;
133+
race<T1, T2, T3, T4, T5, T6>(values: [T1, T2, T3, T4, T5, T6]): Promise<ResolveType<T1 | T2 | T3 | T4 | T5 | T6>>;
134134

135135
/**
136136
* Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
137137
* or rejected.
138138
* @param values An array of Promises.
139139
* @returns A new Promise.
140140
*/
141-
race<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>;
141+
race<T1, T2, T3, T4, T5>(values: [T1, T2, T3, T4, T5]): Promise<ResolveType<T1 | T2 | T3 | T4 | T5>>;
142142

143143
/**
144144
* Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
145145
* or rejected.
146146
* @param values An array of Promises.
147147
* @returns A new Promise.
148148
*/
149-
race<T1, T2, T3, T4>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>]): Promise<T1 | T2 | T3 | T4>;
149+
race<T1, T2, T3, T4>(values: [T1, T2, T3, T4]): Promise<ResolveType<T1 | T2 | T3 | T4>>;
150150

151151
/**
152152
* Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
153153
* or rejected.
154154
* @param values An array of Promises.
155155
* @returns A new Promise.
156156
*/
157-
race<T1, T2, T3>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>]): Promise<T1 | T2 | T3>;
157+
race<T1, T2, T3>(values: [T1, T2, T3]): Promise<ResolveType<T1 | T2 | T3>>;
158158

159159
/**
160160
* Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
161161
* or rejected.
162162
* @param values An array of Promises.
163163
* @returns A new Promise.
164164
*/
165-
race<T1, T2>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>]): Promise<T1 | T2>;
165+
race<T1, T2>(values: [T1, T2]): Promise<ResolveType<T1 | T2>>;
166166

167167
/**
168168
* Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
169169
* or rejected.
170170
* @param values An array of Promises.
171171
* @returns A new Promise.
172172
*/
173-
race<T>(values: (T | PromiseLike<T>)[]): Promise<T>;
173+
race<T>(values: ReadonlyArray<T>): Promise<ResolveType<T>>;
174174

175175
/**
176176
* Creates a new rejected promise for the provided reason.
@@ -184,7 +184,7 @@ interface PromiseConstructor {
184184
* @param value A promise.
185185
* @returns A promise whose internal state matches the provided promise.
186186
*/
187-
resolve<T>(value: T | PromiseLike<T>): Promise<T>;
187+
resolve<T>(value: T): Promise<ResolveType<T>>;
188188

189189
/**
190190
* Creates a new resolved promise .

Diff for: src/lib/es5.d.ts

+5
Original file line numberDiff line numberDiff line change
@@ -1468,6 +1468,11 @@ type ReturnType<T extends (...args: any[]) => any> = T extends (...args: any[])
14681468
*/
14691469
type InstanceType<T extends new (...args: any[]) => any> = T extends new (...args: any[]) => infer R ? R : any;
14701470

1471+
/**
1472+
* Obtain the resolved type of a PromiseLike type
1473+
*/
1474+
type ResolveType<T> = T extends PromiseLike<infer R> ? R : T
1475+
14711476
/**
14721477
* Marker for contextual 'this' type
14731478
*/

0 commit comments

Comments
 (0)