Skip to content

Commit aec9e23

Browse files
authored
Add test which would fail if SFT behavior differs in variance checking (microsoft#54756)
1 parent de6e6ab commit aec9e23

File tree

4 files changed

+207
-0
lines changed

4 files changed

+207
-0
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
//// [tests/cases/compiler/varianceCantBeStrictWhileStructureIsnt.ts] ////
2+
3+
//// [varianceCantBeStrictWhileStructureIsnt.ts]
4+
// under non-strict-function-types, all the below should work
5+
interface Foo<T> {
6+
member: (cb: T) => void;
7+
}
8+
9+
interface Bar<T> {
10+
member: (cb: T) => void;
11+
}
12+
13+
declare var a: Foo<string>;
14+
declare var b: Foo<"">;
15+
16+
declare var a2: Bar<string>;
17+
declare var b2: Bar<"">;
18+
19+
a = b;
20+
b = a;
21+
22+
a2 = b2;
23+
b2 = a2;
24+
25+
a = b2;
26+
b = a2;
27+
28+
a2 = b;
29+
b2 = a;
30+
31+
//// [varianceCantBeStrictWhileStructureIsnt.js]
32+
a = b;
33+
b = a;
34+
a2 = b2;
35+
b2 = a2;
36+
a = b2;
37+
b = a2;
38+
a2 = b;
39+
b2 = a;
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
//// [tests/cases/compiler/varianceCantBeStrictWhileStructureIsnt.ts] ////
2+
3+
=== varianceCantBeStrictWhileStructureIsnt.ts ===
4+
// under non-strict-function-types, all the below should work
5+
interface Foo<T> {
6+
>Foo : Symbol(Foo, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 0, 0))
7+
>T : Symbol(T, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 1, 14))
8+
9+
member: (cb: T) => void;
10+
>member : Symbol(Foo.member, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 1, 18))
11+
>cb : Symbol(cb, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 2, 13))
12+
>T : Symbol(T, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 1, 14))
13+
}
14+
15+
interface Bar<T> {
16+
>Bar : Symbol(Bar, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 3, 1))
17+
>T : Symbol(T, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 5, 14))
18+
19+
member: (cb: T) => void;
20+
>member : Symbol(Bar.member, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 5, 18))
21+
>cb : Symbol(cb, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 6, 13))
22+
>T : Symbol(T, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 5, 14))
23+
}
24+
25+
declare var a: Foo<string>;
26+
>a : Symbol(a, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 9, 11))
27+
>Foo : Symbol(Foo, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 0, 0))
28+
29+
declare var b: Foo<"">;
30+
>b : Symbol(b, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 10, 11))
31+
>Foo : Symbol(Foo, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 0, 0))
32+
33+
declare var a2: Bar<string>;
34+
>a2 : Symbol(a2, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 12, 11))
35+
>Bar : Symbol(Bar, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 3, 1))
36+
37+
declare var b2: Bar<"">;
38+
>b2 : Symbol(b2, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 13, 11))
39+
>Bar : Symbol(Bar, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 3, 1))
40+
41+
a = b;
42+
>a : Symbol(a, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 9, 11))
43+
>b : Symbol(b, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 10, 11))
44+
45+
b = a;
46+
>b : Symbol(b, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 10, 11))
47+
>a : Symbol(a, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 9, 11))
48+
49+
a2 = b2;
50+
>a2 : Symbol(a2, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 12, 11))
51+
>b2 : Symbol(b2, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 13, 11))
52+
53+
b2 = a2;
54+
>b2 : Symbol(b2, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 13, 11))
55+
>a2 : Symbol(a2, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 12, 11))
56+
57+
a = b2;
58+
>a : Symbol(a, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 9, 11))
59+
>b2 : Symbol(b2, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 13, 11))
60+
61+
b = a2;
62+
>b : Symbol(b, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 10, 11))
63+
>a2 : Symbol(a2, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 12, 11))
64+
65+
a2 = b;
66+
>a2 : Symbol(a2, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 12, 11))
67+
>b : Symbol(b, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 10, 11))
68+
69+
b2 = a;
70+
>b2 : Symbol(b2, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 13, 11))
71+
>a : Symbol(a, Decl(varianceCantBeStrictWhileStructureIsnt.ts, 9, 11))
72+
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
//// [tests/cases/compiler/varianceCantBeStrictWhileStructureIsnt.ts] ////
2+
3+
=== varianceCantBeStrictWhileStructureIsnt.ts ===
4+
// under non-strict-function-types, all the below should work
5+
interface Foo<T> {
6+
member: (cb: T) => void;
7+
>member : (cb: T) => void
8+
>cb : T
9+
}
10+
11+
interface Bar<T> {
12+
member: (cb: T) => void;
13+
>member : (cb: T) => void
14+
>cb : T
15+
}
16+
17+
declare var a: Foo<string>;
18+
>a : Foo<string>
19+
20+
declare var b: Foo<"">;
21+
>b : Foo<"">
22+
23+
declare var a2: Bar<string>;
24+
>a2 : Bar<string>
25+
26+
declare var b2: Bar<"">;
27+
>b2 : Bar<"">
28+
29+
a = b;
30+
>a = b : Foo<"">
31+
>a : Foo<string>
32+
>b : Foo<"">
33+
34+
b = a;
35+
>b = a : Foo<string>
36+
>b : Foo<"">
37+
>a : Foo<string>
38+
39+
a2 = b2;
40+
>a2 = b2 : Bar<"">
41+
>a2 : Bar<string>
42+
>b2 : Bar<"">
43+
44+
b2 = a2;
45+
>b2 = a2 : Bar<string>
46+
>b2 : Bar<"">
47+
>a2 : Bar<string>
48+
49+
a = b2;
50+
>a = b2 : Bar<"">
51+
>a : Foo<string>
52+
>b2 : Bar<"">
53+
54+
b = a2;
55+
>b = a2 : Bar<string>
56+
>b : Foo<"">
57+
>a2 : Bar<string>
58+
59+
a2 = b;
60+
>a2 = b : Foo<"">
61+
>a2 : Bar<string>
62+
>b : Foo<"">
63+
64+
b2 = a;
65+
>b2 = a : Foo<string>
66+
>b2 : Bar<"">
67+
>a : Foo<string>
68+
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// @strict: false
2+
// @strictFunctionTypes: false
3+
// under non-strict-function-types, all the below should work
4+
interface Foo<T> {
5+
member: (cb: T) => void;
6+
}
7+
8+
interface Bar<T> {
9+
member: (cb: T) => void;
10+
}
11+
12+
declare var a: Foo<string>;
13+
declare var b: Foo<"">;
14+
15+
declare var a2: Bar<string>;
16+
declare var b2: Bar<"">;
17+
18+
a = b;
19+
b = a;
20+
21+
a2 = b2;
22+
b2 = a2;
23+
24+
a = b2;
25+
b = a2;
26+
27+
a2 = b;
28+
b2 = a;

0 commit comments

Comments
 (0)