@@ -92,3 +92,141 @@ function foo2(x: A | B): any {
92
92
x; // never
93
93
>x : Symbol(x, Decl(discriminantsAndTypePredicates.ts, 20, 14))
94
94
}
95
+
96
+ // Repro from #30557
97
+
98
+ interface TypeA {
99
+ >TypeA : Symbol(TypeA, Decl(discriminantsAndTypePredicates.ts, 30, 1))
100
+
101
+ Name: "TypeA";
102
+ >Name : Symbol(TypeA.Name, Decl(discriminantsAndTypePredicates.ts, 34, 17))
103
+
104
+ Value1: "Cool stuff!";
105
+ >Value1 : Symbol(TypeA.Value1, Decl(discriminantsAndTypePredicates.ts, 35, 18))
106
+ }
107
+
108
+ interface TypeB {
109
+ >TypeB : Symbol(TypeB, Decl(discriminantsAndTypePredicates.ts, 37, 1))
110
+
111
+ Name: "TypeB";
112
+ >Name : Symbol(TypeB.Name, Decl(discriminantsAndTypePredicates.ts, 39, 17))
113
+
114
+ Value2: 0;
115
+ >Value2 : Symbol(TypeB.Value2, Decl(discriminantsAndTypePredicates.ts, 40, 18))
116
+ }
117
+
118
+ type Type = TypeA | TypeB;
119
+ >Type : Symbol(Type, Decl(discriminantsAndTypePredicates.ts, 42, 1))
120
+ >TypeA : Symbol(TypeA, Decl(discriminantsAndTypePredicates.ts, 30, 1))
121
+ >TypeB : Symbol(TypeB, Decl(discriminantsAndTypePredicates.ts, 37, 1))
122
+
123
+ declare function isType(x: unknown): x is Type;
124
+ >isType : Symbol(isType, Decl(discriminantsAndTypePredicates.ts, 44, 26))
125
+ >x : Symbol(x, Decl(discriminantsAndTypePredicates.ts, 46, 24))
126
+ >x : Symbol(x, Decl(discriminantsAndTypePredicates.ts, 46, 24))
127
+ >Type : Symbol(Type, Decl(discriminantsAndTypePredicates.ts, 42, 1))
128
+
129
+ function WorksProperly(data: Type) {
130
+ >WorksProperly : Symbol(WorksProperly, Decl(discriminantsAndTypePredicates.ts, 46, 47))
131
+ >data : Symbol(data, Decl(discriminantsAndTypePredicates.ts, 48, 23))
132
+ >Type : Symbol(Type, Decl(discriminantsAndTypePredicates.ts, 42, 1))
133
+
134
+ if (data.Name === "TypeA") {
135
+ >data.Name : Symbol(Name, Decl(discriminantsAndTypePredicates.ts, 34, 17), Decl(discriminantsAndTypePredicates.ts, 39, 17))
136
+ >data : Symbol(data, Decl(discriminantsAndTypePredicates.ts, 48, 23))
137
+ >Name : Symbol(Name, Decl(discriminantsAndTypePredicates.ts, 34, 17), Decl(discriminantsAndTypePredicates.ts, 39, 17))
138
+
139
+ // TypeA
140
+ const value1 = data.Value1;
141
+ >value1 : Symbol(value1, Decl(discriminantsAndTypePredicates.ts, 51, 6))
142
+ >data.Value1 : Symbol(TypeA.Value1, Decl(discriminantsAndTypePredicates.ts, 35, 18))
143
+ >data : Symbol(data, Decl(discriminantsAndTypePredicates.ts, 48, 23))
144
+ >Value1 : Symbol(TypeA.Value1, Decl(discriminantsAndTypePredicates.ts, 35, 18))
145
+ }
146
+ }
147
+
148
+ function DoesNotWork(data: unknown) {
149
+ >DoesNotWork : Symbol(DoesNotWork, Decl(discriminantsAndTypePredicates.ts, 53, 1))
150
+ >data : Symbol(data, Decl(discriminantsAndTypePredicates.ts, 55, 21))
151
+
152
+ if (isType(data)) {
153
+ >isType : Symbol(isType, Decl(discriminantsAndTypePredicates.ts, 44, 26))
154
+ >data : Symbol(data, Decl(discriminantsAndTypePredicates.ts, 55, 21))
155
+
156
+ if (data.Name === "TypeA") {
157
+ >data.Name : Symbol(Name, Decl(discriminantsAndTypePredicates.ts, 34, 17), Decl(discriminantsAndTypePredicates.ts, 39, 17))
158
+ >data : Symbol(data, Decl(discriminantsAndTypePredicates.ts, 55, 21))
159
+ >Name : Symbol(Name, Decl(discriminantsAndTypePredicates.ts, 34, 17), Decl(discriminantsAndTypePredicates.ts, 39, 17))
160
+
161
+ // TypeB
162
+ const value1 = data.Value1;
163
+ >value1 : Symbol(value1, Decl(discriminantsAndTypePredicates.ts, 59, 10))
164
+ >data.Value1 : Symbol(TypeA.Value1, Decl(discriminantsAndTypePredicates.ts, 35, 18))
165
+ >data : Symbol(data, Decl(discriminantsAndTypePredicates.ts, 55, 21))
166
+ >Value1 : Symbol(TypeA.Value1, Decl(discriminantsAndTypePredicates.ts, 35, 18))
167
+ }
168
+ }
169
+ }
170
+
171
+ function narrowToNever(data: Type): "Cool stuff!" | 0 {
172
+ >narrowToNever : Symbol(narrowToNever, Decl(discriminantsAndTypePredicates.ts, 62, 1))
173
+ >data : Symbol(data, Decl(discriminantsAndTypePredicates.ts, 64, 23))
174
+ >Type : Symbol(Type, Decl(discriminantsAndTypePredicates.ts, 42, 1))
175
+
176
+ if (data.Name === "TypeA") {
177
+ >data.Name : Symbol(Name, Decl(discriminantsAndTypePredicates.ts, 34, 17), Decl(discriminantsAndTypePredicates.ts, 39, 17))
178
+ >data : Symbol(data, Decl(discriminantsAndTypePredicates.ts, 64, 23))
179
+ >Name : Symbol(Name, Decl(discriminantsAndTypePredicates.ts, 34, 17), Decl(discriminantsAndTypePredicates.ts, 39, 17))
180
+
181
+ return data.Value1;
182
+ >data.Value1 : Symbol(TypeA.Value1, Decl(discriminantsAndTypePredicates.ts, 35, 18))
183
+ >data : Symbol(data, Decl(discriminantsAndTypePredicates.ts, 64, 23))
184
+ >Value1 : Symbol(TypeA.Value1, Decl(discriminantsAndTypePredicates.ts, 35, 18))
185
+ }
186
+ if (data.Name === "TypeB") {
187
+ >data.Name : Symbol(TypeB.Name, Decl(discriminantsAndTypePredicates.ts, 39, 17))
188
+ >data : Symbol(data, Decl(discriminantsAndTypePredicates.ts, 64, 23))
189
+ >Name : Symbol(TypeB.Name, Decl(discriminantsAndTypePredicates.ts, 39, 17))
190
+
191
+ return data.Value2;
192
+ >data.Value2 : Symbol(TypeB.Value2, Decl(discriminantsAndTypePredicates.ts, 40, 18))
193
+ >data : Symbol(data, Decl(discriminantsAndTypePredicates.ts, 64, 23))
194
+ >Value2 : Symbol(TypeB.Value2, Decl(discriminantsAndTypePredicates.ts, 40, 18))
195
+ }
196
+ return data;
197
+ >data : Symbol(data, Decl(discriminantsAndTypePredicates.ts, 64, 23))
198
+ }
199
+
200
+ function narrowToNeverUnknown(data: unknown): "Cool stuff!" | 0 {
201
+ >narrowToNeverUnknown : Symbol(narrowToNeverUnknown, Decl(discriminantsAndTypePredicates.ts, 72, 1))
202
+ >data : Symbol(data, Decl(discriminantsAndTypePredicates.ts, 74, 30))
203
+
204
+ if (isType(data)) {
205
+ >isType : Symbol(isType, Decl(discriminantsAndTypePredicates.ts, 44, 26))
206
+ >data : Symbol(data, Decl(discriminantsAndTypePredicates.ts, 74, 30))
207
+
208
+ if (data.Name === "TypeA") {
209
+ >data.Name : Symbol(Name, Decl(discriminantsAndTypePredicates.ts, 34, 17), Decl(discriminantsAndTypePredicates.ts, 39, 17))
210
+ >data : Symbol(data, Decl(discriminantsAndTypePredicates.ts, 74, 30))
211
+ >Name : Symbol(Name, Decl(discriminantsAndTypePredicates.ts, 34, 17), Decl(discriminantsAndTypePredicates.ts, 39, 17))
212
+
213
+ return data.Value1;
214
+ >data.Value1 : Symbol(TypeA.Value1, Decl(discriminantsAndTypePredicates.ts, 35, 18))
215
+ >data : Symbol(data, Decl(discriminantsAndTypePredicates.ts, 74, 30))
216
+ >Value1 : Symbol(TypeA.Value1, Decl(discriminantsAndTypePredicates.ts, 35, 18))
217
+ }
218
+ if (data.Name === "TypeB") {
219
+ >data.Name : Symbol(TypeB.Name, Decl(discriminantsAndTypePredicates.ts, 39, 17))
220
+ >data : Symbol(data, Decl(discriminantsAndTypePredicates.ts, 74, 30))
221
+ >Name : Symbol(TypeB.Name, Decl(discriminantsAndTypePredicates.ts, 39, 17))
222
+
223
+ return data.Value2;
224
+ >data.Value2 : Symbol(TypeB.Value2, Decl(discriminantsAndTypePredicates.ts, 40, 18))
225
+ >data : Symbol(data, Decl(discriminantsAndTypePredicates.ts, 74, 30))
226
+ >Value2 : Symbol(TypeB.Value2, Decl(discriminantsAndTypePredicates.ts, 40, 18))
227
+ }
228
+ return data;
229
+ >data : Symbol(data, Decl(discriminantsAndTypePredicates.ts, 74, 30))
230
+ }
231
+ }
232
+
0 commit comments