Skip to content

Commit 263c54e

Browse files
committed
Add tests for type parameter fixing
1 parent f5ca456 commit 263c54e

12 files changed

+410
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//// [fixingTypeParametersRepeatedly1.ts]
2+
declare function f<T>(x: T, y: (p: T) => T, z: (p: T) => T): T;
3+
f("", x => null, x => x.toLowerCase());
4+
5+
// First overload of g should type check just like f
6+
declare function g<T>(x: T, y: (p: T) => T, z: (p: T) => T): T;
7+
declare function g();
8+
g("", x => null, x => x.toLowerCase());
9+
10+
//// [fixingTypeParametersRepeatedly1.js]
11+
f("", function (x) { return null; }, function (x) { return x.toLowerCase(); });
12+
g("", function (x) { return null; }, function (x) { return x.toLowerCase(); });
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
=== tests/cases/compiler/fixingTypeParametersRepeatedly1.ts ===
2+
declare function f<T>(x: T, y: (p: T) => T, z: (p: T) => T): T;
3+
>f : Symbol(f, Decl(fixingTypeParametersRepeatedly1.ts, 0, 0))
4+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 0, 19))
5+
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly1.ts, 0, 22))
6+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 0, 19))
7+
>y : Symbol(y, Decl(fixingTypeParametersRepeatedly1.ts, 0, 27))
8+
>p : Symbol(p, Decl(fixingTypeParametersRepeatedly1.ts, 0, 32))
9+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 0, 19))
10+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 0, 19))
11+
>z : Symbol(z, Decl(fixingTypeParametersRepeatedly1.ts, 0, 43))
12+
>p : Symbol(p, Decl(fixingTypeParametersRepeatedly1.ts, 0, 48))
13+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 0, 19))
14+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 0, 19))
15+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 0, 19))
16+
17+
f("", x => null, x => x.toLowerCase());
18+
>f : Symbol(f, Decl(fixingTypeParametersRepeatedly1.ts, 0, 0))
19+
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly1.ts, 1, 5))
20+
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly1.ts, 1, 16))
21+
>x.toLowerCase : Symbol(String.toLowerCase, Decl(lib.d.ts, 399, 51))
22+
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly1.ts, 1, 16))
23+
>toLowerCase : Symbol(String.toLowerCase, Decl(lib.d.ts, 399, 51))
24+
25+
// First overload of g should type check just like f
26+
declare function g<T>(x: T, y: (p: T) => T, z: (p: T) => T): T;
27+
>g : Symbol(g, Decl(fixingTypeParametersRepeatedly1.ts, 1, 39), Decl(fixingTypeParametersRepeatedly1.ts, 4, 63))
28+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 4, 19))
29+
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly1.ts, 4, 22))
30+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 4, 19))
31+
>y : Symbol(y, Decl(fixingTypeParametersRepeatedly1.ts, 4, 27))
32+
>p : Symbol(p, Decl(fixingTypeParametersRepeatedly1.ts, 4, 32))
33+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 4, 19))
34+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 4, 19))
35+
>z : Symbol(z, Decl(fixingTypeParametersRepeatedly1.ts, 4, 43))
36+
>p : Symbol(p, Decl(fixingTypeParametersRepeatedly1.ts, 4, 48))
37+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 4, 19))
38+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 4, 19))
39+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 4, 19))
40+
41+
declare function g();
42+
>g : Symbol(g, Decl(fixingTypeParametersRepeatedly1.ts, 1, 39), Decl(fixingTypeParametersRepeatedly1.ts, 4, 63))
43+
44+
g("", x => null, x => x.toLowerCase());
45+
>g : Symbol(g, Decl(fixingTypeParametersRepeatedly1.ts, 1, 39), Decl(fixingTypeParametersRepeatedly1.ts, 4, 63))
46+
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly1.ts, 6, 5))
47+
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly1.ts, 6, 16))
48+
>x.toLowerCase : Symbol(String.toLowerCase, Decl(lib.d.ts, 399, 51))
49+
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly1.ts, 6, 16))
50+
>toLowerCase : Symbol(String.toLowerCase, Decl(lib.d.ts, 399, 51))
51+
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
=== tests/cases/compiler/fixingTypeParametersRepeatedly1.ts ===
2+
declare function f<T>(x: T, y: (p: T) => T, z: (p: T) => T): T;
3+
>f : <T>(x: T, y: (p: T) => T, z: (p: T) => T) => T
4+
>T : T
5+
>x : T
6+
>T : T
7+
>y : (p: T) => T
8+
>p : T
9+
>T : T
10+
>T : T
11+
>z : (p: T) => T
12+
>p : T
13+
>T : T
14+
>T : T
15+
>T : T
16+
17+
f("", x => null, x => x.toLowerCase());
18+
>f("", x => null, x => x.toLowerCase()) : string
19+
>f : <T>(x: T, y: (p: T) => T, z: (p: T) => T) => T
20+
>"" : string
21+
>x => null : (x: string) => any
22+
>x : string
23+
>null : null
24+
>x => x.toLowerCase() : (x: string) => string
25+
>x : string
26+
>x.toLowerCase() : string
27+
>x.toLowerCase : () => string
28+
>x : string
29+
>toLowerCase : () => string
30+
31+
// First overload of g should type check just like f
32+
declare function g<T>(x: T, y: (p: T) => T, z: (p: T) => T): T;
33+
>g : { <T>(x: T, y: (p: T) => T, z: (p: T) => T): T; (): any; }
34+
>T : T
35+
>x : T
36+
>T : T
37+
>y : (p: T) => T
38+
>p : T
39+
>T : T
40+
>T : T
41+
>z : (p: T) => T
42+
>p : T
43+
>T : T
44+
>T : T
45+
>T : T
46+
47+
declare function g();
48+
>g : { <T>(x: T, y: (p: T) => T, z: (p: T) => T): T; (): any; }
49+
50+
g("", x => null, x => x.toLowerCase());
51+
>g("", x => null, x => x.toLowerCase()) : string
52+
>g : { <T>(x: T, y: (p: T) => T, z: (p: T) => T): T; (): any; }
53+
>"" : string
54+
>x => null : (x: string) => any
55+
>x : string
56+
>null : null
57+
>x => x.toLowerCase() : (x: string) => string
58+
>x : string
59+
>x.toLowerCase() : string
60+
>x.toLowerCase : () => string
61+
>x : string
62+
>toLowerCase : () => string
63+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
tests/cases/compiler/fixingTypeParametersRepeatedly2.ts(11,27): error TS2345: Argument of type '(d: Derived) => Base' is not assignable to parameter of type '(p: Derived) => Derived'.
2+
Type 'Base' is not assignable to type 'Derived'.
3+
Property 'toBase' is missing in type 'Base'.
4+
tests/cases/compiler/fixingTypeParametersRepeatedly2.ts(17,27): error TS2345: Argument of type '(d: Derived) => Base' is not assignable to parameter of type '(p: Derived) => Derived'.
5+
Type 'Base' is not assignable to type 'Derived'.
6+
7+
8+
==== tests/cases/compiler/fixingTypeParametersRepeatedly2.ts (2 errors) ====
9+
interface Base {
10+
baseProp;
11+
}
12+
interface Derived extends Base {
13+
toBase(): Base;
14+
}
15+
16+
var derived: Derived;
17+
18+
declare function foo<T>(x: T, func: (p: T) => T): T;
19+
var result = foo(derived, d => d.toBase());
20+
~~~~~~~~~~~~~~~
21+
!!! error TS2345: Argument of type '(d: Derived) => Base' is not assignable to parameter of type '(p: Derived) => Derived'.
22+
!!! error TS2345: Type 'Base' is not assignable to type 'Derived'.
23+
!!! error TS2345: Property 'toBase' is missing in type 'Base'.
24+
25+
// bar should type check just like foo.
26+
// The same error should be observed in both cases.
27+
declare function bar<T>(x: T, func: (p: T) => T): T;
28+
declare function bar<T>(x: T, func: (p: T) => T): T;
29+
var result = bar(derived, d => d.toBase());
30+
~~~~~~~~~~~~~~~
31+
!!! error TS2345: Argument of type '(d: Derived) => Base' is not assignable to parameter of type '(p: Derived) => Derived'.
32+
!!! error TS2345: Type 'Base' is not assignable to type 'Derived'.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//// [fixingTypeParametersRepeatedly2.ts]
2+
interface Base {
3+
baseProp;
4+
}
5+
interface Derived extends Base {
6+
toBase(): Base;
7+
}
8+
9+
var derived: Derived;
10+
11+
declare function foo<T>(x: T, func: (p: T) => T): T;
12+
var result = foo(derived, d => d.toBase());
13+
14+
// bar should type check just like foo.
15+
// The same error should be observed in both cases.
16+
declare function bar<T>(x: T, func: (p: T) => T): T;
17+
declare function bar<T>(x: T, func: (p: T) => T): T;
18+
var result = bar(derived, d => d.toBase());
19+
20+
//// [fixingTypeParametersRepeatedly2.js]
21+
var derived;
22+
var result = foo(derived, function (d) { return d.toBase(); });
23+
var result = bar(derived, function (d) { return d.toBase(); });
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//// [fixingTypeParametersRepeatedly3.ts]
2+
interface Base {
3+
baseProp;
4+
}
5+
interface Derived extends Base {
6+
toBase?(): Base;
7+
}
8+
9+
var derived: Derived;
10+
11+
declare function foo<T>(x: T, func: (p: T) => T): T;
12+
var result = foo(derived, d => d.toBase());
13+
14+
// bar should type check just like foo.
15+
// result2 should have the same type as result
16+
declare function bar<T>(x: T, func: (p: T) => T): T;
17+
declare function bar<T>(x: T, func: (p: T) => T): T;
18+
var result2 = bar(derived, d => d.toBase());
19+
20+
//// [fixingTypeParametersRepeatedly3.js]
21+
var derived;
22+
var result = foo(derived, function (d) { return d.toBase(); });
23+
var result2 = bar(derived, function (d) { return d.toBase(); });
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
=== tests/cases/compiler/fixingTypeParametersRepeatedly3.ts ===
2+
interface Base {
3+
>Base : Symbol(Base, Decl(fixingTypeParametersRepeatedly3.ts, 0, 0))
4+
5+
baseProp;
6+
>baseProp : Symbol(baseProp, Decl(fixingTypeParametersRepeatedly3.ts, 0, 16))
7+
}
8+
interface Derived extends Base {
9+
>Derived : Symbol(Derived, Decl(fixingTypeParametersRepeatedly3.ts, 2, 1))
10+
>Base : Symbol(Base, Decl(fixingTypeParametersRepeatedly3.ts, 0, 0))
11+
12+
toBase?(): Base;
13+
>toBase : Symbol(toBase, Decl(fixingTypeParametersRepeatedly3.ts, 3, 32))
14+
>Base : Symbol(Base, Decl(fixingTypeParametersRepeatedly3.ts, 0, 0))
15+
}
16+
17+
var derived: Derived;
18+
>derived : Symbol(derived, Decl(fixingTypeParametersRepeatedly3.ts, 7, 3))
19+
>Derived : Symbol(Derived, Decl(fixingTypeParametersRepeatedly3.ts, 2, 1))
20+
21+
declare function foo<T>(x: T, func: (p: T) => T): T;
22+
>foo : Symbol(foo, Decl(fixingTypeParametersRepeatedly3.ts, 7, 21))
23+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 9, 21))
24+
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly3.ts, 9, 24))
25+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 9, 21))
26+
>func : Symbol(func, Decl(fixingTypeParametersRepeatedly3.ts, 9, 29))
27+
>p : Symbol(p, Decl(fixingTypeParametersRepeatedly3.ts, 9, 37))
28+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 9, 21))
29+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 9, 21))
30+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 9, 21))
31+
32+
var result = foo(derived, d => d.toBase());
33+
>result : Symbol(result, Decl(fixingTypeParametersRepeatedly3.ts, 10, 3))
34+
>foo : Symbol(foo, Decl(fixingTypeParametersRepeatedly3.ts, 7, 21))
35+
>derived : Symbol(derived, Decl(fixingTypeParametersRepeatedly3.ts, 7, 3))
36+
>d : Symbol(d, Decl(fixingTypeParametersRepeatedly3.ts, 10, 25))
37+
>d.toBase : Symbol(Derived.toBase, Decl(fixingTypeParametersRepeatedly3.ts, 3, 32))
38+
>d : Symbol(d, Decl(fixingTypeParametersRepeatedly3.ts, 10, 25))
39+
>toBase : Symbol(Derived.toBase, Decl(fixingTypeParametersRepeatedly3.ts, 3, 32))
40+
41+
// bar should type check just like foo.
42+
// result2 should have the same type as result
43+
declare function bar<T>(x: T, func: (p: T) => T): T;
44+
>bar : Symbol(bar, Decl(fixingTypeParametersRepeatedly3.ts, 10, 43), Decl(fixingTypeParametersRepeatedly3.ts, 14, 52))
45+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 14, 21))
46+
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly3.ts, 14, 24))
47+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 14, 21))
48+
>func : Symbol(func, Decl(fixingTypeParametersRepeatedly3.ts, 14, 29))
49+
>p : Symbol(p, Decl(fixingTypeParametersRepeatedly3.ts, 14, 37))
50+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 14, 21))
51+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 14, 21))
52+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 14, 21))
53+
54+
declare function bar<T>(x: T, func: (p: T) => T): T;
55+
>bar : Symbol(bar, Decl(fixingTypeParametersRepeatedly3.ts, 10, 43), Decl(fixingTypeParametersRepeatedly3.ts, 14, 52))
56+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 15, 21))
57+
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly3.ts, 15, 24))
58+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 15, 21))
59+
>func : Symbol(func, Decl(fixingTypeParametersRepeatedly3.ts, 15, 29))
60+
>p : Symbol(p, Decl(fixingTypeParametersRepeatedly3.ts, 15, 37))
61+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 15, 21))
62+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 15, 21))
63+
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 15, 21))
64+
65+
var result2 = bar(derived, d => d.toBase());
66+
>result2 : Symbol(result2, Decl(fixingTypeParametersRepeatedly3.ts, 16, 3))
67+
>bar : Symbol(bar, Decl(fixingTypeParametersRepeatedly3.ts, 10, 43), Decl(fixingTypeParametersRepeatedly3.ts, 14, 52))
68+
>derived : Symbol(derived, Decl(fixingTypeParametersRepeatedly3.ts, 7, 3))
69+
>d : Symbol(d, Decl(fixingTypeParametersRepeatedly3.ts, 16, 26))
70+
>d.toBase : Symbol(Derived.toBase, Decl(fixingTypeParametersRepeatedly3.ts, 3, 32))
71+
>d : Symbol(d, Decl(fixingTypeParametersRepeatedly3.ts, 16, 26))
72+
>toBase : Symbol(Derived.toBase, Decl(fixingTypeParametersRepeatedly3.ts, 3, 32))
73+
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
=== tests/cases/compiler/fixingTypeParametersRepeatedly3.ts ===
2+
interface Base {
3+
>Base : Base
4+
5+
baseProp;
6+
>baseProp : any
7+
}
8+
interface Derived extends Base {
9+
>Derived : Derived
10+
>Base : Base
11+
12+
toBase?(): Base;
13+
>toBase : () => Base
14+
>Base : Base
15+
}
16+
17+
var derived: Derived;
18+
>derived : Derived
19+
>Derived : Derived
20+
21+
declare function foo<T>(x: T, func: (p: T) => T): T;
22+
>foo : <T>(x: T, func: (p: T) => T) => T
23+
>T : T
24+
>x : T
25+
>T : T
26+
>func : (p: T) => T
27+
>p : T
28+
>T : T
29+
>T : T
30+
>T : T
31+
32+
var result = foo(derived, d => d.toBase());
33+
>result : Derived
34+
>foo(derived, d => d.toBase()) : Derived
35+
>foo : <T>(x: T, func: (p: T) => T) => T
36+
>derived : Derived
37+
>d => d.toBase() : (d: Derived) => Base
38+
>d : Derived
39+
>d.toBase() : Base
40+
>d.toBase : () => Base
41+
>d : Derived
42+
>toBase : () => Base
43+
44+
// bar should type check just like foo.
45+
// result2 should have the same type as result
46+
declare function bar<T>(x: T, func: (p: T) => T): T;
47+
>bar : { <T>(x: T, func: (p: T) => T): T; <T>(x: T, func: (p: T) => T): T; }
48+
>T : T
49+
>x : T
50+
>T : T
51+
>func : (p: T) => T
52+
>p : T
53+
>T : T
54+
>T : T
55+
>T : T
56+
57+
declare function bar<T>(x: T, func: (p: T) => T): T;
58+
>bar : { <T>(x: T, func: (p: T) => T): T; <T>(x: T, func: (p: T) => T): T; }
59+
>T : T
60+
>x : T
61+
>T : T
62+
>func : (p: T) => T
63+
>p : T
64+
>T : T
65+
>T : T
66+
>T : T
67+
68+
var result2 = bar(derived, d => d.toBase());
69+
>result2 : Derived
70+
>bar(derived, d => d.toBase()) : Derived
71+
>bar : { <T>(x: T, func: (p: T) => T): T; <T>(x: T, func: (p: T) => T): T; }
72+
>derived : Derived
73+
>d => d.toBase() : (d: Derived) => Base
74+
>d : Derived
75+
>d.toBase() : Base
76+
>d.toBase : () => Base
77+
>d : Derived
78+
>toBase : () => Base
79+
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
declare function f<T>(x: T, y: (p: T) => T, z: (p: T) => T): T;
2+
f("", x => null, x => x.toLowerCase());
3+
4+
// First overload of g should type check just like f
5+
declare function g<T>(x: T, y: (p: T) => T, z: (p: T) => T): T;
6+
declare function g();
7+
g("", x => null, x => x.toLowerCase());
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
interface Base {
2+
baseProp;
3+
}
4+
interface Derived extends Base {
5+
toBase(): Base;
6+
}
7+
8+
var derived: Derived;
9+
10+
declare function foo<T>(x: T, func: (p: T) => T): T;
11+
var result = foo(derived, d => d.toBase());
12+
13+
// bar should type check just like foo.
14+
// The same error should be observed in both cases.
15+
declare function bar<T>(x: T, func: (p: T) => T): T;
16+
declare function bar<T>(x: T, func: (p: T) => T): T;
17+
var result = bar(derived, d => d.toBase());

0 commit comments

Comments
 (0)