Skip to content

Commit 1f6cd94

Browse files
Changed tests to error when actual contextual typing is broken.
1 parent e3848b9 commit 1f6cd94

File tree

6 files changed

+227
-104
lines changed

6 files changed

+227
-104
lines changed
Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
11
//// [taggedTemplateContextualTyping1.ts]
22

3-
function tempTag1<T>(templateStrs: TemplateStringsArray, f: (x: T) => T, x: T): T;
4-
function tempTag1<T>(templateStrs: TemplateStringsArray, f: (x: T) => T, h: (y: T) => T, x: T): T;
3+
type FuncType = (x: <T>(p: T) => T) => typeof x;
4+
5+
function tempTag1<T>(templateStrs: TemplateStringsArray, f: FuncType, x: T): T;
6+
function tempTag1<T>(templateStrs: TemplateStringsArray, f: FuncType, h: FuncType, x: T): T;
57
function tempTag1<T>(...rest: any[]): T {
68
return undefined;
79
}
810

9-
tempTag1 `${ x => x }${ 10 }`;
10-
tempTag1 `${ x => x }${ y => y }${ 10 }`;
11-
tempTag1 `${ x => x }${ (y: number) => y }${ undefined }`;
12-
tempTag1 `${ (x: number) => x }${ y => y }${ undefined }`;
11+
// If contextual typing takes place, these functions should work.
12+
// Otherwise, the arrow functions' parameters will be typed as 'any',
13+
// and it is an error to invoke an any-typed value with type arguments,
14+
// so this test will error.
15+
tempTag1 `${ x => { x<number>(undefined); return x; } }${ y => { y<number>(undefined); return y; } }${ 10 }`;
16+
tempTag1 `${ x => { x<number>(undefined); return x; } }${ (y: <T>(p: T) => T) => { y<number>(undefined); return y } }${ undefined }`;
17+
tempTag1 `${ (x: <T>(p: T) => T) => { x<number>(undefined); return x; } }${ y => { y<number>(undefined); return y; } }${ undefined }`;
1318

1419

1520
//// [taggedTemplateContextualTyping1.js]
@@ -20,7 +25,28 @@ function tempTag1() {
2025
}
2126
return undefined;
2227
}
23-
tempTag1 `${function (x) { return x; }}${10}`;
24-
tempTag1 `${function (x) { return x; }}${function (y) { return y; }}${10}`;
25-
tempTag1 `${function (x) { return x; }}${function (y) { return y; }}${undefined}`;
26-
tempTag1 `${function (x) { return x; }}${function (y) { return y; }}${undefined}`;
28+
// If contextual typing takes place, these functions should work.
29+
// Otherwise, the arrow functions' parameters will be typed as 'any',
30+
// and it is an error to invoke an any-typed value with type arguments,
31+
// so this test will error.
32+
tempTag1 `${function (x) {
33+
x(undefined);
34+
return x;
35+
}}${function (y) {
36+
y(undefined);
37+
return y;
38+
}}${10}`;
39+
tempTag1 `${function (x) {
40+
x(undefined);
41+
return x;
42+
}}${function (y) {
43+
y(undefined);
44+
return y;
45+
}}${undefined}`;
46+
tempTag1 `${function (x) {
47+
x(undefined);
48+
return x;
49+
}}${function (y) {
50+
y(undefined);
51+
return y;
52+
}}${undefined}`;
Lines changed: 73 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,40 @@
11
=== tests/cases/conformance/expressions/contextualTyping/taggedTemplateContextualTyping1.ts ===
22

3-
function tempTag1<T>(templateStrs: TemplateStringsArray, f: (x: T) => T, x: T): T;
4-
>tempTag1 : { <T>(templateStrs: TemplateStringsArray, f: (x: T) => T, x: T): T; <T>(templateStrs: TemplateStringsArray, f: (x: T) => T, h: (y: T) => T, x: T): T; }
3+
type FuncType = (x: <T>(p: T) => T) => typeof x;
4+
>FuncType : (x: <T>(p: T) => T) => <T>(p: T) => T
5+
>x : <T>(p: T) => T
56
>T : T
6-
>templateStrs : TemplateStringsArray
7-
>TemplateStringsArray : TemplateStringsArray
8-
>f : (x: T) => T
9-
>x : T
10-
>T : T
11-
>T : T
12-
>x : T
7+
>p : T
138
>T : T
149
>T : T
10+
>x : <T>(p: T) => T
1511

16-
function tempTag1<T>(templateStrs: TemplateStringsArray, f: (x: T) => T, h: (y: T) => T, x: T): T;
17-
>tempTag1 : { <T>(templateStrs: TemplateStringsArray, f: (x: T) => T, x: T): T; <T>(templateStrs: TemplateStringsArray, f: (x: T) => T, h: (y: T) => T, x: T): T; }
12+
function tempTag1<T>(templateStrs: TemplateStringsArray, f: FuncType, x: T): T;
13+
>tempTag1 : { <T>(templateStrs: TemplateStringsArray, f: (x: <T>(p: T) => T) => <T>(p: T) => T, x: T): T; <T>(templateStrs: TemplateStringsArray, f: (x: <T>(p: T) => T) => <T>(p: T) => T, h: (x: <T>(p: T) => T) => <T>(p: T) => T, x: T): T; }
1814
>T : T
1915
>templateStrs : TemplateStringsArray
2016
>TemplateStringsArray : TemplateStringsArray
21-
>f : (x: T) => T
17+
>f : (x: <T>(p: T) => T) => <T>(p: T) => T
18+
>FuncType : (x: <T>(p: T) => T) => <T>(p: T) => T
2219
>x : T
2320
>T : T
2421
>T : T
25-
>h : (y: T) => T
26-
>y : T
27-
>T : T
22+
23+
function tempTag1<T>(templateStrs: TemplateStringsArray, f: FuncType, h: FuncType, x: T): T;
24+
>tempTag1 : { <T>(templateStrs: TemplateStringsArray, f: (x: <T>(p: T) => T) => <T>(p: T) => T, x: T): T; <T>(templateStrs: TemplateStringsArray, f: (x: <T>(p: T) => T) => <T>(p: T) => T, h: (x: <T>(p: T) => T) => <T>(p: T) => T, x: T): T; }
2825
>T : T
26+
>templateStrs : TemplateStringsArray
27+
>TemplateStringsArray : TemplateStringsArray
28+
>f : (x: <T>(p: T) => T) => <T>(p: T) => T
29+
>FuncType : (x: <T>(p: T) => T) => <T>(p: T) => T
30+
>h : (x: <T>(p: T) => T) => <T>(p: T) => T
31+
>FuncType : (x: <T>(p: T) => T) => <T>(p: T) => T
2932
>x : T
3033
>T : T
3134
>T : T
3235

3336
function tempTag1<T>(...rest: any[]): T {
34-
>tempTag1 : { <T>(templateStrs: TemplateStringsArray, f: (x: T) => T, x: T): T; <T>(templateStrs: TemplateStringsArray, f: (x: T) => T, h: (y: T) => T, x: T): T; }
37+
>tempTag1 : { <T>(templateStrs: TemplateStringsArray, f: (x: <T>(p: T) => T) => <T>(p: T) => T, x: T): T; <T>(templateStrs: TemplateStringsArray, f: (x: <T>(p: T) => T) => <T>(p: T) => T, h: (x: <T>(p: T) => T) => <T>(p: T) => T, x: T): T; }
3538
>T : T
3639
>rest : any[]
3740
>T : T
@@ -40,38 +43,62 @@ function tempTag1<T>(...rest: any[]): T {
4043
>undefined : undefined
4144
}
4245

43-
tempTag1 `${ x => x }${ 10 }`;
44-
>tempTag1 : { <T>(templateStrs: TemplateStringsArray, f: (x: T) => T, x: T): T; <T>(templateStrs: TemplateStringsArray, f: (x: T) => T, h: (y: T) => T, x: T): T; }
45-
>x => x : (x: number) => number
46-
>x : number
47-
>x : number
48-
49-
tempTag1 `${ x => x }${ y => y }${ 10 }`;
50-
>tempTag1 : { <T>(templateStrs: TemplateStringsArray, f: (x: T) => T, x: T): T; <T>(templateStrs: TemplateStringsArray, f: (x: T) => T, h: (y: T) => T, x: T): T; }
51-
>x => x : (x: number) => number
52-
>x : number
53-
>x : number
54-
>y => y : (y: number) => number
55-
>y : number
56-
>y : number
46+
// If contextual typing takes place, these functions should work.
47+
// Otherwise, the arrow functions' parameters will be typed as 'any',
48+
// and it is an error to invoke an any-typed value with type arguments,
49+
// so this test will error.
50+
tempTag1 `${ x => { x<number>(undefined); return x; } }${ y => { y<number>(undefined); return y; } }${ 10 }`;
51+
>tempTag1 : { <T>(templateStrs: TemplateStringsArray, f: (x: <T>(p: T) => T) => <T>(p: T) => T, x: T): T; <T>(templateStrs: TemplateStringsArray, f: (x: <T>(p: T) => T) => <T>(p: T) => T, h: (x: <T>(p: T) => T) => <T>(p: T) => T, x: T): T; }
52+
>x => { x<number>(undefined); return x; } : (x: <T>(p: T) => T) => <T>(p: T) => T
53+
>x : <T>(p: T) => T
54+
>x<number>(undefined) : number
55+
>x : <T>(p: T) => T
56+
>undefined : undefined
57+
>x : <T>(p: T) => T
58+
>y => { y<number>(undefined); return y; } : (y: <T>(p: T) => T) => <T>(p: T) => T
59+
>y : <T>(p: T) => T
60+
>y<number>(undefined) : number
61+
>y : <T>(p: T) => T
62+
>undefined : undefined
63+
>y : <T>(p: T) => T
5764

58-
tempTag1 `${ x => x }${ (y: number) => y }${ undefined }`;
59-
>tempTag1 : { <T>(templateStrs: TemplateStringsArray, f: (x: T) => T, x: T): T; <T>(templateStrs: TemplateStringsArray, f: (x: T) => T, h: (y: T) => T, x: T): T; }
60-
>x => x : (x: number) => number
61-
>x : number
62-
>x : number
63-
>(y: number) => y : (y: number) => number
64-
>y : number
65-
>y : number
65+
tempTag1 `${ x => { x<number>(undefined); return x; } }${ (y: <T>(p: T) => T) => { y<number>(undefined); return y } }${ undefined }`;
66+
>tempTag1 : { <T>(templateStrs: TemplateStringsArray, f: (x: <T>(p: T) => T) => <T>(p: T) => T, x: T): T; <T>(templateStrs: TemplateStringsArray, f: (x: <T>(p: T) => T) => <T>(p: T) => T, h: (x: <T>(p: T) => T) => <T>(p: T) => T, x: T): T; }
67+
>x => { x<number>(undefined); return x; } : (x: <T>(p: T) => T) => <T>(p: T) => T
68+
>x : <T>(p: T) => T
69+
>x<number>(undefined) : number
70+
>x : <T>(p: T) => T
71+
>undefined : undefined
72+
>x : <T>(p: T) => T
73+
>(y: <T>(p: T) => T) => { y<number>(undefined); return y } : (y: <T>(p: T) => T) => <T>(p: T) => T
74+
>y : <T>(p: T) => T
75+
>T : T
76+
>p : T
77+
>T : T
78+
>T : T
79+
>y<number>(undefined) : number
80+
>y : <T>(p: T) => T
81+
>undefined : undefined
82+
>y : <T>(p: T) => T
6683
>undefined : undefined
6784

68-
tempTag1 `${ (x: number) => x }${ y => y }${ undefined }`;
69-
>tempTag1 : { <T>(templateStrs: TemplateStringsArray, f: (x: T) => T, x: T): T; <T>(templateStrs: TemplateStringsArray, f: (x: T) => T, h: (y: T) => T, x: T): T; }
70-
>(x: number) => x : (x: number) => number
71-
>x : number
72-
>x : number
73-
>y => y : (y: number) => number
74-
>y : number
75-
>y : number
85+
tempTag1 `${ (x: <T>(p: T) => T) => { x<number>(undefined); return x; } }${ y => { y<number>(undefined); return y; } }${ undefined }`;
86+
>tempTag1 : { <T>(templateStrs: TemplateStringsArray, f: (x: <T>(p: T) => T) => <T>(p: T) => T, x: T): T; <T>(templateStrs: TemplateStringsArray, f: (x: <T>(p: T) => T) => <T>(p: T) => T, h: (x: <T>(p: T) => T) => <T>(p: T) => T, x: T): T; }
87+
>(x: <T>(p: T) => T) => { x<number>(undefined); return x; } : (x: <T>(p: T) => T) => <T>(p: T) => T
88+
>x : <T>(p: T) => T
89+
>T : T
90+
>p : T
91+
>T : T
92+
>T : T
93+
>x<number>(undefined) : number
94+
>x : <T>(p: T) => T
95+
>undefined : undefined
96+
>x : <T>(p: T) => T
97+
>y => { y<number>(undefined); return y; } : (y: <T>(p: T) => T) => <T>(p: T) => T
98+
>y : <T>(p: T) => T
99+
>y<number>(undefined) : number
100+
>y : <T>(p: T) => T
101+
>undefined : undefined
102+
>y : <T>(p: T) => T
76103
>undefined : undefined
77104

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
//// [taggedTemplateContextualTyping2.ts]
22

3-
function tempTag2(templateStrs: TemplateStringsArray, f: (x: number) => number, x: number): number;
4-
function tempTag2(templateStrs: TemplateStringsArray, f: (x: string) => string, h: (y: string) => string, x: string): string;
3+
type FuncType1 = (x: <T>(p: T) => T) => typeof x;
4+
type FuncType2 = (x: <S, T>(p: T) => T) => typeof x;
5+
6+
function tempTag2(templateStrs: TemplateStringsArray, f: FuncType1, x: number): number;
7+
function tempTag2(templateStrs: TemplateStringsArray, f: FuncType2, h: FuncType2, x: string): string;
58
function tempTag2(...rest: any[]): any {
69
return undefined;
710
}
811

9-
tempTag2 `${ x => x }${ 0 }`;
10-
tempTag2 `${ x => x }${ y => y }${ "hello" }`;
11-
tempTag2 `${ x => x }${ 0 }`;
12+
// If contextual typing takes place, these functions should work.
13+
// Otherwise, the arrow functions' parameters will be typed as 'any',
14+
// and it is an error to invoke an any-typed value with type arguments,
15+
// so this test will error.
16+
tempTag2 `${ x => { x<number>(undefined); return x; } }${ 0 }`;
17+
tempTag2 `${ x => { x<number, string>(undefined); return x; } }${ y => { y<string, number>(null); return y; } }${ "hello" }`;
18+
tempTag2 `${ x => { x<number, string>(undefined); return x; } }${ undefined }${ "hello" }`;
1219

1320
//// [taggedTemplateContextualTyping2.js]
1421
function tempTag2() {
@@ -18,6 +25,22 @@ function tempTag2() {
1825
}
1926
return undefined;
2027
}
21-
tempTag2 `${function (x) { return x; }}${0}`;
22-
tempTag2 `${function (x) { return x; }}${function (y) { return y; }}${"hello"}`;
23-
tempTag2 `${function (x) { return x; }}${0}`;
28+
// If contextual typing takes place, these functions should work.
29+
// Otherwise, the arrow functions' parameters will be typed as 'any',
30+
// and it is an error to invoke an any-typed value with type arguments,
31+
// so this test will error.
32+
tempTag2 `${function (x) {
33+
x(undefined);
34+
return x;
35+
}}${0}`;
36+
tempTag2 `${function (x) {
37+
x(undefined);
38+
return x;
39+
}}${function (y) {
40+
y(null);
41+
return y;
42+
}}${"hello"}`;
43+
tempTag2 `${function (x) {
44+
x(undefined);
45+
return x;
46+
}}${undefined}${"hello"}`;
Lines changed: 64 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,84 @@
11
=== tests/cases/conformance/expressions/contextualTyping/taggedTemplateContextualTyping2.ts ===
22

3-
function tempTag2(templateStrs: TemplateStringsArray, f: (x: number) => number, x: number): number;
4-
>tempTag2 : { (templateStrs: TemplateStringsArray, f: (x: number) => number, x: number): number; (templateStrs: TemplateStringsArray, f: (x: string) => string, h: (y: string) => string, x: string): string; }
3+
type FuncType1 = (x: <T>(p: T) => T) => typeof x;
4+
>FuncType1 : (x: <T>(p: T) => T) => <T>(p: T) => T
5+
>x : <T>(p: T) => T
6+
>T : T
7+
>p : T
8+
>T : T
9+
>T : T
10+
>x : <T>(p: T) => T
11+
12+
type FuncType2 = (x: <S, T>(p: T) => T) => typeof x;
13+
>FuncType2 : (x: <S, T>(p: T) => T) => <S, T>(p: T) => T
14+
>x : <S, T>(p: T) => T
15+
>S : S
16+
>T : T
17+
>p : T
18+
>T : T
19+
>T : T
20+
>x : <S, T>(p: T) => T
21+
22+
function tempTag2(templateStrs: TemplateStringsArray, f: FuncType1, x: number): number;
23+
>tempTag2 : { (templateStrs: TemplateStringsArray, f: (x: <T>(p: T) => T) => <T>(p: T) => T, x: number): number; (templateStrs: TemplateStringsArray, f: (x: <S, T>(p: T) => T) => <S, T>(p: T) => T, h: (x: <S, T>(p: T) => T) => <S, T>(p: T) => T, x: string): string; }
524
>templateStrs : TemplateStringsArray
625
>TemplateStringsArray : TemplateStringsArray
7-
>f : (x: number) => number
8-
>x : number
26+
>f : (x: <T>(p: T) => T) => <T>(p: T) => T
27+
>FuncType1 : (x: <T>(p: T) => T) => <T>(p: T) => T
928
>x : number
1029

11-
function tempTag2(templateStrs: TemplateStringsArray, f: (x: string) => string, h: (y: string) => string, x: string): string;
12-
>tempTag2 : { (templateStrs: TemplateStringsArray, f: (x: number) => number, x: number): number; (templateStrs: TemplateStringsArray, f: (x: string) => string, h: (y: string) => string, x: string): string; }
30+
function tempTag2(templateStrs: TemplateStringsArray, f: FuncType2, h: FuncType2, x: string): string;
31+
>tempTag2 : { (templateStrs: TemplateStringsArray, f: (x: <T>(p: T) => T) => <T>(p: T) => T, x: number): number; (templateStrs: TemplateStringsArray, f: (x: <S, T>(p: T) => T) => <S, T>(p: T) => T, h: (x: <S, T>(p: T) => T) => <S, T>(p: T) => T, x: string): string; }
1332
>templateStrs : TemplateStringsArray
1433
>TemplateStringsArray : TemplateStringsArray
15-
>f : (x: string) => string
16-
>x : string
17-
>h : (y: string) => string
18-
>y : string
34+
>f : (x: <S, T>(p: T) => T) => <S, T>(p: T) => T
35+
>FuncType2 : (x: <S, T>(p: T) => T) => <S, T>(p: T) => T
36+
>h : (x: <S, T>(p: T) => T) => <S, T>(p: T) => T
37+
>FuncType2 : (x: <S, T>(p: T) => T) => <S, T>(p: T) => T
1938
>x : string
2039

2140
function tempTag2(...rest: any[]): any {
22-
>tempTag2 : { (templateStrs: TemplateStringsArray, f: (x: number) => number, x: number): number; (templateStrs: TemplateStringsArray, f: (x: string) => string, h: (y: string) => string, x: string): string; }
41+
>tempTag2 : { (templateStrs: TemplateStringsArray, f: (x: <T>(p: T) => T) => <T>(p: T) => T, x: number): number; (templateStrs: TemplateStringsArray, f: (x: <S, T>(p: T) => T) => <S, T>(p: T) => T, h: (x: <S, T>(p: T) => T) => <S, T>(p: T) => T, x: string): string; }
2342
>rest : any[]
2443

2544
return undefined;
2645
>undefined : undefined
2746
}
2847

29-
tempTag2 `${ x => x }${ 0 }`;
30-
>tempTag2 : { (templateStrs: TemplateStringsArray, f: (x: number) => number, x: number): number; (templateStrs: TemplateStringsArray, f: (x: string) => string, h: (y: string) => string, x: string): string; }
31-
>x => x : (x: number) => number
32-
>x : number
33-
>x : number
48+
// If contextual typing takes place, these functions should work.
49+
// Otherwise, the arrow functions' parameters will be typed as 'any',
50+
// and it is an error to invoke an any-typed value with type arguments,
51+
// so this test will error.
52+
tempTag2 `${ x => { x<number>(undefined); return x; } }${ 0 }`;
53+
>tempTag2 : { (templateStrs: TemplateStringsArray, f: (x: <T>(p: T) => T) => <T>(p: T) => T, x: number): number; (templateStrs: TemplateStringsArray, f: (x: <S, T>(p: T) => T) => <S, T>(p: T) => T, h: (x: <S, T>(p: T) => T) => <S, T>(p: T) => T, x: string): string; }
54+
>x => { x<number>(undefined); return x; } : (x: <T>(p: T) => T) => <T>(p: T) => T
55+
>x : <T>(p: T) => T
56+
>x<number>(undefined) : number
57+
>x : <T>(p: T) => T
58+
>undefined : undefined
59+
>x : <T>(p: T) => T
3460

35-
tempTag2 `${ x => x }${ y => y }${ "hello" }`;
36-
>tempTag2 : { (templateStrs: TemplateStringsArray, f: (x: number) => number, x: number): number; (templateStrs: TemplateStringsArray, f: (x: string) => string, h: (y: string) => string, x: string): string; }
37-
>x => x : (x: string) => string
38-
>x : string
39-
>x : string
40-
>y => y : (y: string) => string
41-
>y : string
42-
>y : string
61+
tempTag2 `${ x => { x<number, string>(undefined); return x; } }${ y => { y<string, number>(null); return y; } }${ "hello" }`;
62+
>tempTag2 : { (templateStrs: TemplateStringsArray, f: (x: <T>(p: T) => T) => <T>(p: T) => T, x: number): number; (templateStrs: TemplateStringsArray, f: (x: <S, T>(p: T) => T) => <S, T>(p: T) => T, h: (x: <S, T>(p: T) => T) => <S, T>(p: T) => T, x: string): string; }
63+
>x => { x<number, string>(undefined); return x; } : (x: <S, T>(p: T) => T) => <S, T>(p: T) => T
64+
>x : <S, T>(p: T) => T
65+
>x<number, string>(undefined) : string
66+
>x : <S, T>(p: T) => T
67+
>undefined : undefined
68+
>x : <S, T>(p: T) => T
69+
>y => { y<string, number>(null); return y; } : (y: <S, T>(p: T) => T) => <S, T>(p: T) => T
70+
>y : <S, T>(p: T) => T
71+
>y<string, number>(null) : number
72+
>y : <S, T>(p: T) => T
73+
>y : <S, T>(p: T) => T
4374

44-
tempTag2 `${ x => x }${ 0 }`;
45-
>tempTag2 : { (templateStrs: TemplateStringsArray, f: (x: number) => number, x: number): number; (templateStrs: TemplateStringsArray, f: (x: string) => string, h: (y: string) => string, x: string): string; }
46-
>x => x : (x: number) => number
47-
>x : number
48-
>x : number
75+
tempTag2 `${ x => { x<number, string>(undefined); return x; } }${ undefined }${ "hello" }`;
76+
>tempTag2 : { (templateStrs: TemplateStringsArray, f: (x: <T>(p: T) => T) => <T>(p: T) => T, x: number): number; (templateStrs: TemplateStringsArray, f: (x: <S, T>(p: T) => T) => <S, T>(p: T) => T, h: (x: <S, T>(p: T) => T) => <S, T>(p: T) => T, x: string): string; }
77+
>x => { x<number, string>(undefined); return x; } : (x: <S, T>(p: T) => T) => <S, T>(p: T) => T
78+
>x : <S, T>(p: T) => T
79+
>x<number, string>(undefined) : string
80+
>x : <S, T>(p: T) => T
81+
>undefined : undefined
82+
>x : <S, T>(p: T) => T
83+
>undefined : undefined
4984

0 commit comments

Comments
 (0)