Skip to content

Commit ec6f6ee

Browse files
committed
Add test demonstrating current bad behavior
1 parent 55d8bed commit ec6f6ee

5 files changed

+232
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts(12,5): error TS2322: Type 'Concrete2' is not assignable to type 'Concrete1'.
2+
Types of parameters 'x' and 'x' are incompatible.
3+
Type 'U' is not assignable to type 'string'.
4+
Type 'number' is not assignable to type 'string'.
5+
genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts(13,5): error TS2322: Type 'Concrete1' is not assignable to type 'Concrete2'.
6+
Types of parameters 'x' and 'x' are incompatible.
7+
Type 'U' is not assignable to type 'number'.
8+
Type 'string' is not assignable to type 'number'.
9+
genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts(15,5): error TS2322: Type 'Concrete1' is not assignable to type 'Fn<T1>'.
10+
Types of parameters 'x' and 'x' are incompatible.
11+
Type 'U' is not assignable to type 'number'.
12+
Type 'T1' is not assignable to type 'number'.
13+
genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts(16,5): error TS2322: Type 'Fn<T1>' is not assignable to type 'Concrete1'.
14+
Types of parameters 'x' and 'x' are incompatible.
15+
Type 'U' is not assignable to type 'T1'.
16+
'T1' could be instantiated with an arbitrary type which could be unrelated to 'U'.
17+
18+
19+
==== genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts (4 errors) ====
20+
type Fn<T> = <U extends T>(x: U) => U;
21+
22+
type Concrete1 = <U extends number>(x: U) => U;
23+
type Concrete2 = <U extends string>(x: U) => U;
24+
25+
function f<T1, T2>(t1: Fn<T1>, t2: Fn<T2>, c1: Concrete1, c2: Concrete2) {
26+
// every single one of these assignments should error
27+
28+
t1 = t2;
29+
t2 = t1;
30+
31+
c1 = c2;
32+
~~
33+
!!! error TS2322: Type 'Concrete2' is not assignable to type 'Concrete1'.
34+
!!! error TS2322: Types of parameters 'x' and 'x' are incompatible.
35+
!!! error TS2322: Type 'U' is not assignable to type 'string'.
36+
!!! error TS2322: Type 'number' is not assignable to type 'string'.
37+
c2 = c1;
38+
~~
39+
!!! error TS2322: Type 'Concrete1' is not assignable to type 'Concrete2'.
40+
!!! error TS2322: Types of parameters 'x' and 'x' are incompatible.
41+
!!! error TS2322: Type 'U' is not assignable to type 'number'.
42+
!!! error TS2322: Type 'string' is not assignable to type 'number'.
43+
44+
t1 = c1;
45+
~~
46+
!!! error TS2322: Type 'Concrete1' is not assignable to type 'Fn<T1>'.
47+
!!! error TS2322: Types of parameters 'x' and 'x' are incompatible.
48+
!!! error TS2322: Type 'U' is not assignable to type 'number'.
49+
!!! error TS2322: Type 'T1' is not assignable to type 'number'.
50+
!!! related TS2208 genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts:6:12: This type parameter might need an `extends number` constraint.
51+
c1 = t1;
52+
~~
53+
!!! error TS2322: Type 'Fn<T1>' is not assignable to type 'Concrete1'.
54+
!!! error TS2322: Types of parameters 'x' and 'x' are incompatible.
55+
!!! error TS2322: Type 'U' is not assignable to type 'T1'.
56+
!!! error TS2322: 'T1' could be instantiated with an arbitrary type which could be unrelated to 'U'.
57+
}
58+
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//// [tests/cases/compiler/genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts] ////
2+
3+
//// [genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts]
4+
type Fn<T> = <U extends T>(x: U) => U;
5+
6+
type Concrete1 = <U extends number>(x: U) => U;
7+
type Concrete2 = <U extends string>(x: U) => U;
8+
9+
function f<T1, T2>(t1: Fn<T1>, t2: Fn<T2>, c1: Concrete1, c2: Concrete2) {
10+
// every single one of these assignments should error
11+
12+
t1 = t2;
13+
t2 = t1;
14+
15+
c1 = c2;
16+
c2 = c1;
17+
18+
t1 = c1;
19+
c1 = t1;
20+
}
21+
22+
23+
//// [genericSignaturesConstrainedToDifferingGenericsNotCompatible.js]
24+
"use strict";
25+
function f(t1, t2, c1, c2) {
26+
// every single one of these assignments should error
27+
t1 = t2;
28+
t2 = t1;
29+
c1 = c2;
30+
c2 = c1;
31+
t1 = c1;
32+
c1 = t1;
33+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
//// [tests/cases/compiler/genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts] ////
2+
3+
=== genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts ===
4+
type Fn<T> = <U extends T>(x: U) => U;
5+
>Fn : Symbol(Fn, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 0, 0))
6+
>T : Symbol(T, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 0, 8))
7+
>U : Symbol(U, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 0, 14))
8+
>T : Symbol(T, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 0, 8))
9+
>x : Symbol(x, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 0, 27))
10+
>U : Symbol(U, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 0, 14))
11+
>U : Symbol(U, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 0, 14))
12+
13+
type Concrete1 = <U extends number>(x: U) => U;
14+
>Concrete1 : Symbol(Concrete1, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 0, 38))
15+
>U : Symbol(U, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 2, 18))
16+
>x : Symbol(x, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 2, 36))
17+
>U : Symbol(U, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 2, 18))
18+
>U : Symbol(U, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 2, 18))
19+
20+
type Concrete2 = <U extends string>(x: U) => U;
21+
>Concrete2 : Symbol(Concrete2, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 2, 47))
22+
>U : Symbol(U, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 3, 18))
23+
>x : Symbol(x, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 3, 36))
24+
>U : Symbol(U, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 3, 18))
25+
>U : Symbol(U, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 3, 18))
26+
27+
function f<T1, T2>(t1: Fn<T1>, t2: Fn<T2>, c1: Concrete1, c2: Concrete2) {
28+
>f : Symbol(f, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 3, 47))
29+
>T1 : Symbol(T1, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 5, 11))
30+
>T2 : Symbol(T2, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 5, 14))
31+
>t1 : Symbol(t1, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 5, 19))
32+
>Fn : Symbol(Fn, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 0, 0))
33+
>T1 : Symbol(T1, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 5, 11))
34+
>t2 : Symbol(t2, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 5, 30))
35+
>Fn : Symbol(Fn, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 0, 0))
36+
>T2 : Symbol(T2, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 5, 14))
37+
>c1 : Symbol(c1, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 5, 42))
38+
>Concrete1 : Symbol(Concrete1, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 0, 38))
39+
>c2 : Symbol(c2, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 5, 57))
40+
>Concrete2 : Symbol(Concrete2, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 2, 47))
41+
42+
// every single one of these assignments should error
43+
44+
t1 = t2;
45+
>t1 : Symbol(t1, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 5, 19))
46+
>t2 : Symbol(t2, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 5, 30))
47+
48+
t2 = t1;
49+
>t2 : Symbol(t2, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 5, 30))
50+
>t1 : Symbol(t1, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 5, 19))
51+
52+
c1 = c2;
53+
>c1 : Symbol(c1, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 5, 42))
54+
>c2 : Symbol(c2, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 5, 57))
55+
56+
c2 = c1;
57+
>c2 : Symbol(c2, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 5, 57))
58+
>c1 : Symbol(c1, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 5, 42))
59+
60+
t1 = c1;
61+
>t1 : Symbol(t1, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 5, 19))
62+
>c1 : Symbol(c1, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 5, 42))
63+
64+
c1 = t1;
65+
>c1 : Symbol(c1, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 5, 42))
66+
>t1 : Symbol(t1, Decl(genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts, 5, 19))
67+
}
68+
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
//// [tests/cases/compiler/genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts] ////
2+
3+
=== genericSignaturesConstrainedToDifferingGenericsNotCompatible.ts ===
4+
type Fn<T> = <U extends T>(x: U) => U;
5+
>Fn : Fn<T>
6+
>x : U
7+
8+
type Concrete1 = <U extends number>(x: U) => U;
9+
>Concrete1 : <U extends number>(x: U) => U
10+
>x : U
11+
12+
type Concrete2 = <U extends string>(x: U) => U;
13+
>Concrete2 : <U extends string>(x: U) => U
14+
>x : U
15+
16+
function f<T1, T2>(t1: Fn<T1>, t2: Fn<T2>, c1: Concrete1, c2: Concrete2) {
17+
>f : <T1, T2>(t1: Fn<T1>, t2: Fn<T2>, c1: Concrete1, c2: Concrete2) => void
18+
>t1 : Fn<T1>
19+
>t2 : Fn<T2>
20+
>c1 : Concrete1
21+
>c2 : Concrete2
22+
23+
// every single one of these assignments should error
24+
25+
t1 = t2;
26+
>t1 = t2 : Fn<T2>
27+
>t1 : Fn<T1>
28+
>t2 : Fn<T2>
29+
30+
t2 = t1;
31+
>t2 = t1 : Fn<T1>
32+
>t2 : Fn<T2>
33+
>t1 : Fn<T1>
34+
35+
c1 = c2;
36+
>c1 = c2 : Concrete2
37+
>c1 : Concrete1
38+
>c2 : Concrete2
39+
40+
c2 = c1;
41+
>c2 = c1 : Concrete1
42+
>c2 : Concrete2
43+
>c1 : Concrete1
44+
45+
t1 = c1;
46+
>t1 = c1 : Concrete1
47+
>t1 : Fn<T1>
48+
>c1 : Concrete1
49+
50+
c1 = t1;
51+
>c1 = t1 : Fn<T1>
52+
>c1 : Concrete1
53+
>t1 : Fn<T1>
54+
}
55+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// @strict: true
2+
type Fn<T> = <U extends T>(x: U) => U;
3+
4+
type Concrete1 = <U extends number>(x: U) => U;
5+
type Concrete2 = <U extends string>(x: U) => U;
6+
7+
function f<T1, T2>(t1: Fn<T1>, t2: Fn<T2>, c1: Concrete1, c2: Concrete2) {
8+
// every single one of these assignments should error
9+
10+
t1 = t2;
11+
t2 = t1;
12+
13+
c1 = c2;
14+
c2 = c1;
15+
16+
t1 = c1;
17+
c1 = t1;
18+
}

0 commit comments

Comments
 (0)