Skip to content

Commit 21f5f39

Browse files
authored
Add test for type inference of Promise/PromiseLike union bug (#58213)
1 parent e75f470 commit 21f5f39

File tree

4 files changed

+228
-0
lines changed

4 files changed

+228
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//// [tests/cases/compiler/promiseTypeInferenceUnion.ts] ////
2+
3+
//// [promiseTypeInferenceUnion.ts]
4+
function f1(x: number): number | Promise<number> {
5+
return Promise.resolve(x);
6+
}
7+
8+
function f2(x: number): number | PromiseLike<number> {
9+
return Promise.resolve(x);
10+
}
11+
12+
function f3(x: number): number | Promise<number> | PromiseLike<number> {
13+
return Promise.resolve(x);
14+
}
15+
16+
const g1: Promise<number> = Promise.resolve(f1(42));
17+
const g2: Promise<number> = Promise.resolve(f2(42));
18+
const g3: Promise<number> = Promise.resolve(f3(42));
19+
20+
//// [promiseTypeInferenceUnion.js]
21+
function f1(x) {
22+
return Promise.resolve(x);
23+
}
24+
function f2(x) {
25+
return Promise.resolve(x);
26+
}
27+
function f3(x) {
28+
return Promise.resolve(x);
29+
}
30+
const g1 = Promise.resolve(f1(42));
31+
const g2 = Promise.resolve(f2(42));
32+
const g3 = Promise.resolve(f3(42));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
//// [tests/cases/compiler/promiseTypeInferenceUnion.ts] ////
2+
3+
=== promiseTypeInferenceUnion.ts ===
4+
function f1(x: number): number | Promise<number> {
5+
>f1 : Symbol(f1, Decl(promiseTypeInferenceUnion.ts, 0, 0))
6+
>x : Symbol(x, Decl(promiseTypeInferenceUnion.ts, 0, 12))
7+
>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, --, --), Decl(lib.es2018.promise.d.ts, --, --))
8+
9+
return Promise.resolve(x);
10+
>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
11+
>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, --, --), Decl(lib.es2018.promise.d.ts, --, --))
12+
>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
13+
>x : Symbol(x, Decl(promiseTypeInferenceUnion.ts, 0, 12))
14+
}
15+
16+
function f2(x: number): number | PromiseLike<number> {
17+
>f2 : Symbol(f2, Decl(promiseTypeInferenceUnion.ts, 2, 1))
18+
>x : Symbol(x, Decl(promiseTypeInferenceUnion.ts, 4, 12))
19+
>PromiseLike : Symbol(PromiseLike, Decl(lib.es5.d.ts, --, --))
20+
21+
return Promise.resolve(x);
22+
>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
23+
>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, --, --), Decl(lib.es2018.promise.d.ts, --, --))
24+
>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
25+
>x : Symbol(x, Decl(promiseTypeInferenceUnion.ts, 4, 12))
26+
}
27+
28+
function f3(x: number): number | Promise<number> | PromiseLike<number> {
29+
>f3 : Symbol(f3, Decl(promiseTypeInferenceUnion.ts, 6, 1))
30+
>x : Symbol(x, Decl(promiseTypeInferenceUnion.ts, 8, 12))
31+
>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, --, --), Decl(lib.es2018.promise.d.ts, --, --))
32+
>PromiseLike : Symbol(PromiseLike, Decl(lib.es5.d.ts, --, --))
33+
34+
return Promise.resolve(x);
35+
>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
36+
>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, --, --), Decl(lib.es2018.promise.d.ts, --, --))
37+
>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
38+
>x : Symbol(x, Decl(promiseTypeInferenceUnion.ts, 8, 12))
39+
}
40+
41+
const g1: Promise<number> = Promise.resolve(f1(42));
42+
>g1 : Symbol(g1, Decl(promiseTypeInferenceUnion.ts, 12, 5))
43+
>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, --, --), Decl(lib.es2018.promise.d.ts, --, --))
44+
>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
45+
>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, --, --), Decl(lib.es2018.promise.d.ts, --, --))
46+
>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
47+
>f1 : Symbol(f1, Decl(promiseTypeInferenceUnion.ts, 0, 0))
48+
49+
const g2: Promise<number> = Promise.resolve(f2(42));
50+
>g2 : Symbol(g2, Decl(promiseTypeInferenceUnion.ts, 13, 5))
51+
>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, --, --), Decl(lib.es2018.promise.d.ts, --, --))
52+
>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
53+
>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, --, --), Decl(lib.es2018.promise.d.ts, --, --))
54+
>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
55+
>f2 : Symbol(f2, Decl(promiseTypeInferenceUnion.ts, 2, 1))
56+
57+
const g3: Promise<number> = Promise.resolve(f3(42));
58+
>g3 : Symbol(g3, Decl(promiseTypeInferenceUnion.ts, 14, 5))
59+
>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, --, --), Decl(lib.es2018.promise.d.ts, --, --))
60+
>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
61+
>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, --, --), Decl(lib.es2018.promise.d.ts, --, --))
62+
>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
63+
>f3 : Symbol(f3, Decl(promiseTypeInferenceUnion.ts, 6, 1))
64+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
//// [tests/cases/compiler/promiseTypeInferenceUnion.ts] ////
2+
3+
=== promiseTypeInferenceUnion.ts ===
4+
function f1(x: number): number | Promise<number> {
5+
>f1 : (x: number) => number | Promise<number>
6+
> : ^ ^^ ^^^^^
7+
>x : number
8+
> : ^^^^^^
9+
10+
return Promise.resolve(x);
11+
>Promise.resolve(x) : Promise<number>
12+
> : ^^^^^^^^^^^^^^^
13+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<Awaited<T>>; <T_1>(value: T_1 | PromiseLike<T_1>): Promise<Awaited<T_1>>; }
14+
> : ^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
15+
>Promise : PromiseConstructor
16+
> : ^^^^^^^^^^^^^^^^^^
17+
>resolve : { (): Promise<void>; <T>(value: T): Promise<Awaited<T>>; <T_1>(value: T_1 | PromiseLike<T_1>): Promise<Awaited<T_1>>; }
18+
> : ^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
19+
>x : number
20+
> : ^^^^^^
21+
}
22+
23+
function f2(x: number): number | PromiseLike<number> {
24+
>f2 : (x: number) => number | PromiseLike<number>
25+
> : ^ ^^ ^^^^^
26+
>x : number
27+
> : ^^^^^^
28+
29+
return Promise.resolve(x);
30+
>Promise.resolve(x) : Promise<number>
31+
> : ^^^^^^^^^^^^^^^
32+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<Awaited<T>>; <T_1>(value: T_1 | PromiseLike<T_1>): Promise<Awaited<T_1>>; }
33+
> : ^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
34+
>Promise : PromiseConstructor
35+
> : ^^^^^^^^^^^^^^^^^^
36+
>resolve : { (): Promise<void>; <T>(value: T): Promise<Awaited<T>>; <T_1>(value: T_1 | PromiseLike<T_1>): Promise<Awaited<T_1>>; }
37+
> : ^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
38+
>x : number
39+
> : ^^^^^^
40+
}
41+
42+
function f3(x: number): number | Promise<number> | PromiseLike<number> {
43+
>f3 : (x: number) => number | Promise<number> | PromiseLike<number>
44+
> : ^ ^^ ^^^^^
45+
>x : number
46+
> : ^^^^^^
47+
48+
return Promise.resolve(x);
49+
>Promise.resolve(x) : Promise<number>
50+
> : ^^^^^^^^^^^^^^^
51+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<Awaited<T>>; <T_1>(value: T_1 | PromiseLike<T_1>): Promise<Awaited<T_1>>; }
52+
> : ^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
53+
>Promise : PromiseConstructor
54+
> : ^^^^^^^^^^^^^^^^^^
55+
>resolve : { (): Promise<void>; <T>(value: T): Promise<Awaited<T>>; <T_1>(value: T_1 | PromiseLike<T_1>): Promise<Awaited<T_1>>; }
56+
> : ^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
57+
>x : number
58+
> : ^^^^^^
59+
}
60+
61+
const g1: Promise<number> = Promise.resolve(f1(42));
62+
>g1 : Promise<number>
63+
> : ^^^^^^^^^^^^^^^
64+
>Promise.resolve(f1(42)) : Promise<number>
65+
> : ^^^^^^^^^^^^^^^
66+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<Awaited<T>>; <T_1>(value: T_1 | PromiseLike<T_1>): Promise<Awaited<T_1>>; }
67+
> : ^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
68+
>Promise : PromiseConstructor
69+
> : ^^^^^^^^^^^^^^^^^^
70+
>resolve : { (): Promise<void>; <T>(value: T): Promise<Awaited<T>>; <T_1>(value: T_1 | PromiseLike<T_1>): Promise<Awaited<T_1>>; }
71+
> : ^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
72+
>f1(42) : number | Promise<number>
73+
> : ^^^^^^^^^^^^^^^^^^^^^^^^
74+
>f1 : (x: number) => number | Promise<number>
75+
> : ^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
76+
>42 : 42
77+
> : ^^
78+
79+
const g2: Promise<number> = Promise.resolve(f2(42));
80+
>g2 : Promise<number>
81+
> : ^^^^^^^^^^^^^^^
82+
>Promise.resolve(f2(42)) : Promise<number>
83+
> : ^^^^^^^^^^^^^^^
84+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<Awaited<T>>; <T_1>(value: T_1 | PromiseLike<T_1>): Promise<Awaited<T_1>>; }
85+
> : ^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
86+
>Promise : PromiseConstructor
87+
> : ^^^^^^^^^^^^^^^^^^
88+
>resolve : { (): Promise<void>; <T>(value: T): Promise<Awaited<T>>; <T_1>(value: T_1 | PromiseLike<T_1>): Promise<Awaited<T_1>>; }
89+
> : ^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
90+
>f2(42) : number | PromiseLike<number>
91+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
92+
>f2 : (x: number) => number | PromiseLike<number>
93+
> : ^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
94+
>42 : 42
95+
> : ^^
96+
97+
const g3: Promise<number> = Promise.resolve(f3(42));
98+
>g3 : Promise<number>
99+
> : ^^^^^^^^^^^^^^^
100+
>Promise.resolve(f3(42)) : Promise<number>
101+
> : ^^^^^^^^^^^^^^^
102+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<Awaited<T>>; <T_1>(value: T_1 | PromiseLike<T_1>): Promise<Awaited<T_1>>; }
103+
> : ^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
104+
>Promise : PromiseConstructor
105+
> : ^^^^^^^^^^^^^^^^^^
106+
>resolve : { (): Promise<void>; <T>(value: T): Promise<Awaited<T>>; <T_1>(value: T_1 | PromiseLike<T_1>): Promise<Awaited<T_1>>; }
107+
> : ^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
108+
>f3(42) : number | Promise<number> | PromiseLike<number>
109+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
110+
>f3 : (x: number) => number | Promise<number> | PromiseLike<number>
111+
> : ^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
112+
>42 : 42
113+
> : ^^
114+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// @target: esnext
2+
// @lib: esnext
3+
4+
function f1(x: number): number | Promise<number> {
5+
return Promise.resolve(x);
6+
}
7+
8+
function f2(x: number): number | PromiseLike<number> {
9+
return Promise.resolve(x);
10+
}
11+
12+
function f3(x: number): number | Promise<number> | PromiseLike<number> {
13+
return Promise.resolve(x);
14+
}
15+
16+
const g1: Promise<number> = Promise.resolve(f1(42));
17+
const g2: Promise<number> = Promise.resolve(f2(42));
18+
const g3: Promise<number> = Promise.resolve(f3(42));

0 commit comments

Comments
 (0)