@@ -92,3 +92,141 @@ function foo2(x: A | B): any {
9292 x; // never
9393>x : Symbol(x, Decl(discriminantsAndTypePredicates.ts, 20, 14))
9494}
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+ // TypeA
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