Skip to content

Commit c380780

Browse files
committed
Add test for discriminant property order-independence and update baselines
1 parent 968d5de commit c380780

File tree

4 files changed

+370
-0
lines changed

4 files changed

+370
-0
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
//// [tests/cases/compiler/discriminantOrderIndependence.ts] ////
2+
3+
//// [discriminantOrderIndependence.ts]
4+
interface A {
5+
subType: "b";
6+
type: "a";
7+
}
8+
9+
declare let order1:
10+
| { type: "1" }
11+
| A
12+
| { type: "2" }
13+
| { type: "3" }
14+
| undefined;
15+
16+
// Should NOT error: 'order1' is possibly 'undefined' after the guard
17+
if (order1 && order1.type === "a") {
18+
order1.type; // Should be OK
19+
}
20+
21+
interface B {
22+
subType: "b";
23+
type: "a";
24+
}
25+
26+
declare let order2:
27+
| { type: "1" }
28+
| { type: "2" }
29+
| { type: "3" }
30+
| B
31+
| undefined;
32+
33+
// Should NOT error: 'order2' is possibly 'undefined' after the guard
34+
if (order2 && order2.type === "a") {
35+
order2.type; // Should be OK
36+
}
37+
38+
// Also test with !. type assertion
39+
if (order1 && order1.type === "a") {
40+
order1.type; // Should be OK
41+
}
42+
if (order2 && order2.type === "a") {
43+
order2.type; // Should be OK
44+
}
45+
46+
//// [discriminantOrderIndependence.js]
47+
// Should NOT error: 'order1' is possibly 'undefined' after the guard
48+
if (order1 && order1.type === "a") {
49+
order1.type; // Should be OK
50+
}
51+
// Should NOT error: 'order2' is possibly 'undefined' after the guard
52+
if (order2 && order2.type === "a") {
53+
order2.type; // Should be OK
54+
}
55+
// Also test with !. type assertion
56+
if (order1 && order1.type === "a") {
57+
order1.type; // Should be OK
58+
}
59+
if (order2 && order2.type === "a") {
60+
order2.type; // Should be OK
61+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
//// [tests/cases/compiler/discriminantOrderIndependence.ts] ////
2+
3+
=== discriminantOrderIndependence.ts ===
4+
interface A {
5+
>A : Symbol(A, Decl(discriminantOrderIndependence.ts, 0, 0))
6+
7+
subType: "b";
8+
>subType : Symbol(A.subType, Decl(discriminantOrderIndependence.ts, 0, 13))
9+
10+
type: "a";
11+
>type : Symbol(A.type, Decl(discriminantOrderIndependence.ts, 1, 17))
12+
}
13+
14+
declare let order1:
15+
>order1 : Symbol(order1, Decl(discriminantOrderIndependence.ts, 5, 11))
16+
17+
| { type: "1" }
18+
>type : Symbol(type, Decl(discriminantOrderIndependence.ts, 6, 7))
19+
20+
| A
21+
>A : Symbol(A, Decl(discriminantOrderIndependence.ts, 0, 0))
22+
23+
| { type: "2" }
24+
>type : Symbol(type, Decl(discriminantOrderIndependence.ts, 8, 7))
25+
26+
| { type: "3" }
27+
>type : Symbol(type, Decl(discriminantOrderIndependence.ts, 9, 7))
28+
29+
| undefined;
30+
31+
// Should NOT error: 'order1' is possibly 'undefined' after the guard
32+
if (order1 && order1.type === "a") {
33+
>order1 : Symbol(order1, Decl(discriminantOrderIndependence.ts, 5, 11))
34+
>order1.type : Symbol(type, Decl(discriminantOrderIndependence.ts, 1, 17), Decl(discriminantOrderIndependence.ts, 6, 7), Decl(discriminantOrderIndependence.ts, 8, 7), Decl(discriminantOrderIndependence.ts, 9, 7))
35+
>order1 : Symbol(order1, Decl(discriminantOrderIndependence.ts, 5, 11))
36+
>type : Symbol(type, Decl(discriminantOrderIndependence.ts, 1, 17), Decl(discriminantOrderIndependence.ts, 6, 7), Decl(discriminantOrderIndependence.ts, 8, 7), Decl(discriminantOrderIndependence.ts, 9, 7))
37+
38+
order1.type; // Should be OK
39+
>order1.type : Symbol(A.type, Decl(discriminantOrderIndependence.ts, 1, 17))
40+
>order1 : Symbol(order1, Decl(discriminantOrderIndependence.ts, 5, 11))
41+
>type : Symbol(A.type, Decl(discriminantOrderIndependence.ts, 1, 17))
42+
}
43+
44+
interface B {
45+
>B : Symbol(B, Decl(discriminantOrderIndependence.ts, 15, 1))
46+
47+
subType: "b";
48+
>subType : Symbol(B.subType, Decl(discriminantOrderIndependence.ts, 17, 13))
49+
50+
type: "a";
51+
>type : Symbol(B.type, Decl(discriminantOrderIndependence.ts, 18, 17))
52+
}
53+
54+
declare let order2:
55+
>order2 : Symbol(order2, Decl(discriminantOrderIndependence.ts, 22, 11))
56+
57+
| { type: "1" }
58+
>type : Symbol(type, Decl(discriminantOrderIndependence.ts, 23, 7))
59+
60+
| { type: "2" }
61+
>type : Symbol(type, Decl(discriminantOrderIndependence.ts, 24, 7))
62+
63+
| { type: "3" }
64+
>type : Symbol(type, Decl(discriminantOrderIndependence.ts, 25, 7))
65+
66+
| B
67+
>B : Symbol(B, Decl(discriminantOrderIndependence.ts, 15, 1))
68+
69+
| undefined;
70+
71+
// Should NOT error: 'order2' is possibly 'undefined' after the guard
72+
if (order2 && order2.type === "a") {
73+
>order2 : Symbol(order2, Decl(discriminantOrderIndependence.ts, 22, 11))
74+
>order2.type : Symbol(type, Decl(discriminantOrderIndependence.ts, 18, 17), Decl(discriminantOrderIndependence.ts, 23, 7), Decl(discriminantOrderIndependence.ts, 24, 7), Decl(discriminantOrderIndependence.ts, 25, 7))
75+
>order2 : Symbol(order2, Decl(discriminantOrderIndependence.ts, 22, 11))
76+
>type : Symbol(type, Decl(discriminantOrderIndependence.ts, 18, 17), Decl(discriminantOrderIndependence.ts, 23, 7), Decl(discriminantOrderIndependence.ts, 24, 7), Decl(discriminantOrderIndependence.ts, 25, 7))
77+
78+
order2.type; // Should be OK
79+
>order2.type : Symbol(B.type, Decl(discriminantOrderIndependence.ts, 18, 17))
80+
>order2 : Symbol(order2, Decl(discriminantOrderIndependence.ts, 22, 11))
81+
>type : Symbol(B.type, Decl(discriminantOrderIndependence.ts, 18, 17))
82+
}
83+
84+
// Also test with !. type assertion
85+
if (order1 && order1.type === "a") {
86+
>order1 : Symbol(order1, Decl(discriminantOrderIndependence.ts, 5, 11))
87+
>order1.type : Symbol(type, Decl(discriminantOrderIndependence.ts, 1, 17), Decl(discriminantOrderIndependence.ts, 6, 7), Decl(discriminantOrderIndependence.ts, 8, 7), Decl(discriminantOrderIndependence.ts, 9, 7))
88+
>order1 : Symbol(order1, Decl(discriminantOrderIndependence.ts, 5, 11))
89+
>type : Symbol(type, Decl(discriminantOrderIndependence.ts, 1, 17), Decl(discriminantOrderIndependence.ts, 6, 7), Decl(discriminantOrderIndependence.ts, 8, 7), Decl(discriminantOrderIndependence.ts, 9, 7))
90+
91+
order1.type; // Should be OK
92+
>order1.type : Symbol(A.type, Decl(discriminantOrderIndependence.ts, 1, 17))
93+
>order1 : Symbol(order1, Decl(discriminantOrderIndependence.ts, 5, 11))
94+
>type : Symbol(A.type, Decl(discriminantOrderIndependence.ts, 1, 17))
95+
}
96+
if (order2 && order2.type === "a") {
97+
>order2 : Symbol(order2, Decl(discriminantOrderIndependence.ts, 22, 11))
98+
>order2.type : Symbol(type, Decl(discriminantOrderIndependence.ts, 18, 17), Decl(discriminantOrderIndependence.ts, 23, 7), Decl(discriminantOrderIndependence.ts, 24, 7), Decl(discriminantOrderIndependence.ts, 25, 7))
99+
>order2 : Symbol(order2, Decl(discriminantOrderIndependence.ts, 22, 11))
100+
>type : Symbol(type, Decl(discriminantOrderIndependence.ts, 18, 17), Decl(discriminantOrderIndependence.ts, 23, 7), Decl(discriminantOrderIndependence.ts, 24, 7), Decl(discriminantOrderIndependence.ts, 25, 7))
101+
102+
order2.type; // Should be OK
103+
>order2.type : Symbol(B.type, Decl(discriminantOrderIndependence.ts, 18, 17))
104+
>order2 : Symbol(order2, Decl(discriminantOrderIndependence.ts, 22, 11))
105+
>type : Symbol(B.type, Decl(discriminantOrderIndependence.ts, 18, 17))
106+
}
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
//// [tests/cases/compiler/discriminantOrderIndependence.ts] ////
2+
3+
=== discriminantOrderIndependence.ts ===
4+
interface A {
5+
subType: "b";
6+
>subType : "b"
7+
> : ^^^
8+
9+
type: "a";
10+
>type : "a"
11+
> : ^^^
12+
}
13+
14+
declare let order1:
15+
>order1 : A | { type: "1"; } | { type: "2"; } | { type: "3"; }
16+
> : ^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
17+
18+
| { type: "1" }
19+
>type : "1"
20+
> : ^^^
21+
22+
| A
23+
| { type: "2" }
24+
>type : "2"
25+
> : ^^^
26+
27+
| { type: "3" }
28+
>type : "3"
29+
> : ^^^
30+
31+
| undefined;
32+
33+
// Should NOT error: 'order1' is possibly 'undefined' after the guard
34+
if (order1 && order1.type === "a") {
35+
>order1 && order1.type === "a" : boolean
36+
> : ^^^^^^^
37+
>order1 : A | { type: "1"; } | { type: "2"; } | { type: "3"; }
38+
> : ^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
39+
>order1.type === "a" : boolean
40+
> : ^^^^^^^
41+
>order1.type : "a" | "1" | "2" | "3"
42+
> : ^^^^^^^^^^^^^^^^^^^^^
43+
>order1 : A | { type: "1"; } | { type: "2"; } | { type: "3"; }
44+
> : ^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
45+
>type : "a" | "1" | "2" | "3"
46+
> : ^^^^^^^^^^^^^^^^^^^^^
47+
>"a" : "a"
48+
> : ^^^
49+
50+
order1.type; // Should be OK
51+
>order1.type : "a"
52+
> : ^^^
53+
>order1 : A
54+
> : ^
55+
>type : "a"
56+
> : ^^^
57+
}
58+
59+
interface B {
60+
subType: "b";
61+
>subType : "b"
62+
> : ^^^
63+
64+
type: "a";
65+
>type : "a"
66+
> : ^^^
67+
}
68+
69+
declare let order2:
70+
>order2 : B | { type: "1"; } | { type: "2"; } | { type: "3"; }
71+
> : ^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
72+
73+
| { type: "1" }
74+
>type : "1"
75+
> : ^^^
76+
77+
| { type: "2" }
78+
>type : "2"
79+
> : ^^^
80+
81+
| { type: "3" }
82+
>type : "3"
83+
> : ^^^
84+
85+
| B
86+
| undefined;
87+
88+
// Should NOT error: 'order2' is possibly 'undefined' after the guard
89+
if (order2 && order2.type === "a") {
90+
>order2 && order2.type === "a" : boolean
91+
> : ^^^^^^^
92+
>order2 : B | { type: "1"; } | { type: "2"; } | { type: "3"; }
93+
> : ^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
94+
>order2.type === "a" : boolean
95+
> : ^^^^^^^
96+
>order2.type : "a" | "1" | "2" | "3"
97+
> : ^^^^^^^^^^^^^^^^^^^^^
98+
>order2 : B | { type: "1"; } | { type: "2"; } | { type: "3"; }
99+
> : ^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
100+
>type : "a" | "1" | "2" | "3"
101+
> : ^^^^^^^^^^^^^^^^^^^^^
102+
>"a" : "a"
103+
> : ^^^
104+
105+
order2.type; // Should be OK
106+
>order2.type : "a"
107+
> : ^^^
108+
>order2 : B
109+
> : ^
110+
>type : "a"
111+
> : ^^^
112+
}
113+
114+
// Also test with !. type assertion
115+
if (order1 && order1.type === "a") {
116+
>order1 && order1.type === "a" : boolean
117+
> : ^^^^^^^
118+
>order1 : A | { type: "1"; } | { type: "2"; } | { type: "3"; }
119+
> : ^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
120+
>order1.type === "a" : boolean
121+
> : ^^^^^^^
122+
>order1.type : "a" | "1" | "2" | "3"
123+
> : ^^^^^^^^^^^^^^^^^^^^^
124+
>order1 : A | { type: "1"; } | { type: "2"; } | { type: "3"; }
125+
> : ^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
126+
>type : "a" | "1" | "2" | "3"
127+
> : ^^^^^^^^^^^^^^^^^^^^^
128+
>"a" : "a"
129+
> : ^^^
130+
131+
order1.type; // Should be OK
132+
>order1.type : "a"
133+
> : ^^^
134+
>order1 : A
135+
> : ^
136+
>type : "a"
137+
> : ^^^
138+
}
139+
if (order2 && order2.type === "a") {
140+
>order2 && order2.type === "a" : boolean
141+
> : ^^^^^^^
142+
>order2 : B | { type: "1"; } | { type: "2"; } | { type: "3"; }
143+
> : ^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
144+
>order2.type === "a" : boolean
145+
> : ^^^^^^^
146+
>order2.type : "a" | "1" | "2" | "3"
147+
> : ^^^^^^^^^^^^^^^^^^^^^
148+
>order2 : B | { type: "1"; } | { type: "2"; } | { type: "3"; }
149+
> : ^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
150+
>type : "a" | "1" | "2" | "3"
151+
> : ^^^^^^^^^^^^^^^^^^^^^
152+
>"a" : "a"
153+
> : ^^^
154+
155+
order2.type; // Should be OK
156+
>order2.type : "a"
157+
> : ^^^
158+
>order2 : B
159+
> : ^
160+
>type : "a"
161+
> : ^^^
162+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
interface A {
2+
subType: "b";
3+
type: "a";
4+
}
5+
6+
declare let order1:
7+
| { type: "1" }
8+
| A
9+
| { type: "2" }
10+
| { type: "3" }
11+
| undefined;
12+
13+
// Should NOT error: 'order1' is possibly 'undefined' after the guard
14+
if (order1 && order1.type === "a") {
15+
order1.type; // Should be OK
16+
}
17+
18+
interface B {
19+
subType: "b";
20+
type: "a";
21+
}
22+
23+
declare let order2:
24+
| { type: "1" }
25+
| { type: "2" }
26+
| { type: "3" }
27+
| B
28+
| undefined;
29+
30+
// Should NOT error: 'order2' is possibly 'undefined' after the guard
31+
if (order2 && order2.type === "a") {
32+
order2.type; // Should be OK
33+
}
34+
35+
// Also test with !. type assertion
36+
if (order1 && order1.type === "a") {
37+
order1.type; // Should be OK
38+
}
39+
if (order2 && order2.type === "a") {
40+
order2.type; // Should be OK
41+
}

0 commit comments

Comments
 (0)