Skip to content

Commit 88254eb

Browse files
jablkorbuckton
authored andcommitted
Better typings for Promise.resolve(), like microsoft#31117
1 parent df1faa0 commit 88254eb

File tree

41 files changed

+290
-265
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+290
-265
lines changed

src/lib/es2015.promise.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ interface PromiseConstructor {
5252
* @param value A promise.
5353
* @returns A promise whose internal state matches the provided promise.
5454
*/
55-
resolve<T>(value: T | PromiseLike<T>): Promise<T>;
55+
resolve<T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>;
5656
}
5757

5858
declare var Promise: PromiseConstructor;

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 : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
14+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
1515
>Promise : PromiseConstructor
16-
>resolve : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
16+
>resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
1717

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

tests/baselines/reference/asyncFunctionReturnType.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,14 @@ async function fGenericIndexedTypeForKProp<TObj extends Obj, K extends keyof TOb
6767
return obj[key];
6868
}
6969

70-
async function fGenericIndexedTypeForPromiseOfKProp<TObj extends Obj, K extends keyof TObj>(obj: TObj, key: K): Promise<TObj[K]> {
70+
async function fGenericIndexedTypeForPromiseOfKProp<TObj extends Obj, K extends keyof TObj>(obj: TObj, key: K): Promise<TObj[K] extends PromiseLike<infer U> ? U : TObj[K]> {
7171
return Promise.resolve(obj[key]);
7272
}
7373

74-
async function fGenericIndexedTypeForExplicitPromiseOfKProp<TObj extends Obj, K extends keyof TObj>(obj: TObj, key: K): Promise<TObj[K]> {
74+
async function fGenericIndexedTypeForExplicitPromiseOfKProp<TObj extends Obj, K extends keyof TObj>(obj: TObj, key: K): Promise<TObj[K] extends PromiseLike<infer U> ? U : TObj[K]> {
7575
return Promise.resolve<TObj[K]>(obj[key]);
76-
}
76+
}
77+
7778

7879
//// [asyncFunctionReturnType.js]
7980
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {

tests/baselines/reference/asyncFunctionReturnType.symbols

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ async function fGenericIndexedTypeForKProp<TObj extends Obj, K extends keyof TOb
240240
>key : Symbol(key, Decl(asyncFunctionReturnType.ts, 64, 93))
241241
}
242242

243-
async function fGenericIndexedTypeForPromiseOfKProp<TObj extends Obj, K extends keyof TObj>(obj: TObj, key: K): Promise<TObj[K]> {
243+
async function fGenericIndexedTypeForPromiseOfKProp<TObj extends Obj, K extends keyof TObj>(obj: TObj, key: K): Promise<TObj[K] extends PromiseLike<infer U> ? U : TObj[K]> {
244244
>fGenericIndexedTypeForPromiseOfKProp : Symbol(fGenericIndexedTypeForPromiseOfKProp, Decl(asyncFunctionReturnType.ts, 66, 1))
245245
>TObj : Symbol(TObj, Decl(asyncFunctionReturnType.ts, 68, 52))
246246
>Obj : Symbol(Obj, Decl(asyncFunctionReturnType.ts, 8, 1))
@@ -252,6 +252,11 @@ async function fGenericIndexedTypeForPromiseOfKProp<TObj extends Obj, K extends
252252
>K : Symbol(K, Decl(asyncFunctionReturnType.ts, 68, 69))
253253
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --))
254254
>TObj : Symbol(TObj, Decl(asyncFunctionReturnType.ts, 68, 52))
255+
>K : Symbol(K, Decl(asyncFunctionReturnType.ts, 68, 69))
256+
>PromiseLike : Symbol(PromiseLike, Decl(lib.es5.d.ts, --, --))
257+
>U : Symbol(U, Decl(asyncFunctionReturnType.ts, 68, 153))
258+
>U : Symbol(U, Decl(asyncFunctionReturnType.ts, 68, 153))
259+
>TObj : Symbol(TObj, Decl(asyncFunctionReturnType.ts, 68, 52))
255260
>K : Symbol(K, Decl(asyncFunctionReturnType.ts, 68, 69))
256261

257262
return Promise.resolve(obj[key]);
@@ -262,7 +267,7 @@ async function fGenericIndexedTypeForPromiseOfKProp<TObj extends Obj, K extends
262267
>key : Symbol(key, Decl(asyncFunctionReturnType.ts, 68, 102))
263268
}
264269

265-
async function fGenericIndexedTypeForExplicitPromiseOfKProp<TObj extends Obj, K extends keyof TObj>(obj: TObj, key: K): Promise<TObj[K]> {
270+
async function fGenericIndexedTypeForExplicitPromiseOfKProp<TObj extends Obj, K extends keyof TObj>(obj: TObj, key: K): Promise<TObj[K] extends PromiseLike<infer U> ? U : TObj[K]> {
266271
>fGenericIndexedTypeForExplicitPromiseOfKProp : Symbol(fGenericIndexedTypeForExplicitPromiseOfKProp, Decl(asyncFunctionReturnType.ts, 70, 1))
267272
>TObj : Symbol(TObj, Decl(asyncFunctionReturnType.ts, 72, 60))
268273
>Obj : Symbol(Obj, Decl(asyncFunctionReturnType.ts, 8, 1))
@@ -274,6 +279,11 @@ async function fGenericIndexedTypeForExplicitPromiseOfKProp<TObj extends Obj, K
274279
>K : Symbol(K, Decl(asyncFunctionReturnType.ts, 72, 77))
275280
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --))
276281
>TObj : Symbol(TObj, Decl(asyncFunctionReturnType.ts, 72, 60))
282+
>K : Symbol(K, Decl(asyncFunctionReturnType.ts, 72, 77))
283+
>PromiseLike : Symbol(PromiseLike, Decl(lib.es5.d.ts, --, --))
284+
>U : Symbol(U, Decl(asyncFunctionReturnType.ts, 72, 161))
285+
>U : Symbol(U, Decl(asyncFunctionReturnType.ts, 72, 161))
286+
>TObj : Symbol(TObj, Decl(asyncFunctionReturnType.ts, 72, 60))
277287
>K : Symbol(K, Decl(asyncFunctionReturnType.ts, 72, 77))
278288

279289
return Promise.resolve<TObj[K]>(obj[key]);
@@ -285,3 +295,4 @@ async function fGenericIndexedTypeForExplicitPromiseOfKProp<TObj extends Obj, K
285295
>obj : Symbol(obj, Decl(asyncFunctionReturnType.ts, 72, 100))
286296
>key : Symbol(key, Decl(asyncFunctionReturnType.ts, 72, 110))
287297
}
298+

tests/baselines/reference/asyncFunctionReturnType.types

Lines changed: 29 additions & 28 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 : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
47+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
4848
>Promise : PromiseConstructor
49-
>resolve : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
49+
>resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
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 : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
61+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
6262
>Promise : PromiseConstructor
63-
>resolve : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
63+
>resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
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 : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
85+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
8686
>Promise : PromiseConstructor
87-
>resolve : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
87+
>resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
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 : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
99+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
100100
>Promise : PromiseConstructor
101-
>resolve : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
101+
>resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
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 : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
123+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
124124
>Promise : PromiseConstructor
125-
>resolve : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
125+
>resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
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 : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
136+
>Promise.resolve<TObj["stringProp"]>(obj.stringProp) : Promise<TObj["stringProp"] extends PromiseLike<infer U> ? U : TObj["stringProp"]>
137+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
138138
>Promise : PromiseConstructor
139-
>resolve : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
139+
>resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
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 : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
161+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
162162
>Promise : PromiseConstructor
163-
>resolve : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
163+
>resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
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 : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
174+
>Promise.resolve<TObj["anyProp"]>(obj.anyProp) : Promise<TObj["anyProp"] extends PromiseLike<infer U> ? U : TObj["anyProp"]>
175+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
176176
>Promise : PromiseConstructor
177-
>resolve : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
177+
>resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
178178
>obj.anyProp : any
179179
>obj : TObj
180180
>anyProp : any
@@ -191,32 +191,33 @@ async function fGenericIndexedTypeForKProp<TObj extends Obj, K extends keyof TOb
191191
>key : K
192192
}
193193

194-
async function fGenericIndexedTypeForPromiseOfKProp<TObj extends Obj, K extends keyof TObj>(obj: TObj, key: K): Promise<TObj[K]> {
195-
>fGenericIndexedTypeForPromiseOfKProp : <TObj extends Obj, K extends keyof TObj>(obj: TObj, key: K) => Promise<TObj[K]>
194+
async function fGenericIndexedTypeForPromiseOfKProp<TObj extends Obj, K extends keyof TObj>(obj: TObj, key: K): Promise<TObj[K] extends PromiseLike<infer U> ? U : TObj[K]> {
195+
>fGenericIndexedTypeForPromiseOfKProp : <TObj extends Obj, K extends keyof TObj>(obj: TObj, key: K) => Promise<TObj[K] extends PromiseLike<infer U> ? U : TObj[K]>
196196
>obj : TObj
197197
>key : K
198198

199199
return Promise.resolve(obj[key]);
200-
>Promise.resolve(obj[key]) : Promise<TObj[K]>
201-
>Promise.resolve : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
200+
>Promise.resolve(obj[key]) : Promise<TObj[K] extends PromiseLike<infer U> ? U : TObj[K]>
201+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
202202
>Promise : PromiseConstructor
203-
>resolve : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
203+
>resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
204204
>obj[key] : TObj[K]
205205
>obj : TObj
206206
>key : K
207207
}
208208

209-
async function fGenericIndexedTypeForExplicitPromiseOfKProp<TObj extends Obj, K extends keyof TObj>(obj: TObj, key: K): Promise<TObj[K]> {
210-
>fGenericIndexedTypeForExplicitPromiseOfKProp : <TObj extends Obj, K extends keyof TObj>(obj: TObj, key: K) => Promise<TObj[K]>
209+
async function fGenericIndexedTypeForExplicitPromiseOfKProp<TObj extends Obj, K extends keyof TObj>(obj: TObj, key: K): Promise<TObj[K] extends PromiseLike<infer U> ? U : TObj[K]> {
210+
>fGenericIndexedTypeForExplicitPromiseOfKProp : <TObj extends Obj, K extends keyof TObj>(obj: TObj, key: K) => Promise<TObj[K] extends PromiseLike<infer U> ? U : TObj[K]>
211211
>obj : TObj
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 : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
215+
>Promise.resolve<TObj[K]>(obj[key]) : Promise<TObj[K] extends PromiseLike<infer U> ? U : TObj[K]>
216+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
217217
>Promise : PromiseConstructor
218-
>resolve : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
218+
>resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
219219
>obj[key] : TObj[K]
220220
>obj : TObj
221221
>key : K
222222
}
223+

tests/baselines/reference/awaitCallExpressionInSyncFunction.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ function foo() {
77
>await(Promise.resolve(1)) : any
88
>await : any
99
>Promise.resolve(1) : Promise<number>
10-
>Promise.resolve : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
10+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
1111
>Promise : PromiseConstructor
12-
>resolve : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
12+
>resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
1313
>1 : 1
1414

1515
return foo;

tests/baselines/reference/classStaticBlock23(target=es2022).types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ const nums = [1, 2, 3].map(n => Promise.resolve(n))
1111
>n => Promise.resolve(n) : (n: number) => Promise<number>
1212
>n : number
1313
>Promise.resolve(n) : Promise<number>
14-
>Promise.resolve : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
14+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
1515
>Promise : PromiseConstructor
16-
>resolve : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
16+
>resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
1717
>n : number
1818

1919
class C {

tests/baselines/reference/classStaticBlock23(target=esnext).types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ const nums = [1, 2, 3].map(n => Promise.resolve(n))
1111
>n => Promise.resolve(n) : (n: number) => Promise<number>
1212
>n : number
1313
>Promise.resolve(n) : Promise<number>
14-
>Promise.resolve : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
14+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
1515
>Promise : PromiseConstructor
16-
>resolve : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
16+
>resolve : { (): Promise<void>; <T>(value: T): Promise<T extends PromiseLike<infer U> ? U : T>; }
1717
>n : number
1818

1919
class C {

0 commit comments

Comments
 (0)