File: discriminantPropertyCheck.symbols

package info (click to toggle)
node-typescript 3.3.3333-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 324,548 kB
  • sloc: makefile: 6; sh: 3
file content (510 lines) | stat: -rw-r--r-- 24,063 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
=== tests/cases/compiler/discriminantPropertyCheck.ts ===
type Item = Item1 | Item2;
>Item : Symbol(Item, Decl(discriminantPropertyCheck.ts, 0, 0))
>Item1 : Symbol(Item1, Decl(discriminantPropertyCheck.ts, 4, 1))
>Item2 : Symbol(Item2, Decl(discriminantPropertyCheck.ts, 11, 1))

interface Base {
>Base : Symbol(Base, Decl(discriminantPropertyCheck.ts, 0, 26))

    bar: boolean;
>bar : Symbol(Base.bar, Decl(discriminantPropertyCheck.ts, 2, 16))
}

interface Item1 extends Base {
>Item1 : Symbol(Item1, Decl(discriminantPropertyCheck.ts, 4, 1))
>Base : Symbol(Base, Decl(discriminantPropertyCheck.ts, 0, 26))

    kind: "A";
>kind : Symbol(Item1.kind, Decl(discriminantPropertyCheck.ts, 6, 30))

    foo: string | undefined;
>foo : Symbol(Item1.foo, Decl(discriminantPropertyCheck.ts, 7, 14))

    baz: boolean;
>baz : Symbol(Item1.baz, Decl(discriminantPropertyCheck.ts, 8, 28))

    qux: true;
>qux : Symbol(Item1.qux, Decl(discriminantPropertyCheck.ts, 9, 17))
}

interface Item2 extends Base {
>Item2 : Symbol(Item2, Decl(discriminantPropertyCheck.ts, 11, 1))
>Base : Symbol(Base, Decl(discriminantPropertyCheck.ts, 0, 26))

    kind: "B";
>kind : Symbol(Item2.kind, Decl(discriminantPropertyCheck.ts, 13, 30))

    foo: string | undefined;
>foo : Symbol(Item2.foo, Decl(discriminantPropertyCheck.ts, 14, 14))

    baz: boolean;
>baz : Symbol(Item2.baz, Decl(discriminantPropertyCheck.ts, 15, 28))

    qux: false;
>qux : Symbol(Item2.qux, Decl(discriminantPropertyCheck.ts, 16, 17))
}

function goo1(x: Item) {
>goo1 : Symbol(goo1, Decl(discriminantPropertyCheck.ts, 18, 1))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 20, 14))
>Item : Symbol(Item, Decl(discriminantPropertyCheck.ts, 0, 0))

    if (x.kind === "A" && x.foo !== undefined) {
>x.kind : Symbol(kind, Decl(discriminantPropertyCheck.ts, 6, 30), Decl(discriminantPropertyCheck.ts, 13, 30))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 20, 14))
>kind : Symbol(kind, Decl(discriminantPropertyCheck.ts, 6, 30), Decl(discriminantPropertyCheck.ts, 13, 30))
>x.foo : Symbol(Item1.foo, Decl(discriminantPropertyCheck.ts, 7, 14))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 20, 14))
>foo : Symbol(Item1.foo, Decl(discriminantPropertyCheck.ts, 7, 14))
>undefined : Symbol(undefined)

        x.foo.length;
>x.foo.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
>x.foo : Symbol(Item1.foo, Decl(discriminantPropertyCheck.ts, 7, 14))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 20, 14))
>foo : Symbol(Item1.foo, Decl(discriminantPropertyCheck.ts, 7, 14))
>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
    }
}

function goo2(x: Item) {
>goo2 : Symbol(goo2, Decl(discriminantPropertyCheck.ts, 24, 1))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 26, 14))
>Item : Symbol(Item, Decl(discriminantPropertyCheck.ts, 0, 0))

    if (x.foo !== undefined && x.kind === "A") {
>x.foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 7, 14), Decl(discriminantPropertyCheck.ts, 14, 14))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 26, 14))
>foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 7, 14), Decl(discriminantPropertyCheck.ts, 14, 14))
>undefined : Symbol(undefined)
>x.kind : Symbol(kind, Decl(discriminantPropertyCheck.ts, 6, 30), Decl(discriminantPropertyCheck.ts, 13, 30))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 26, 14))
>kind : Symbol(kind, Decl(discriminantPropertyCheck.ts, 6, 30), Decl(discriminantPropertyCheck.ts, 13, 30))

        x.foo.length;  // Error, intervening discriminant guard
>x.foo.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
>x.foo : Symbol(Item1.foo, Decl(discriminantPropertyCheck.ts, 7, 14))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 26, 14))
>foo : Symbol(Item1.foo, Decl(discriminantPropertyCheck.ts, 7, 14))
>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
    }
}

function foo1(x: Item) {
>foo1 : Symbol(foo1, Decl(discriminantPropertyCheck.ts, 30, 1))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 32, 14))
>Item : Symbol(Item, Decl(discriminantPropertyCheck.ts, 0, 0))

    if (x.bar && x.foo !== undefined) {
>x.bar : Symbol(Base.bar, Decl(discriminantPropertyCheck.ts, 2, 16))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 32, 14))
>bar : Symbol(Base.bar, Decl(discriminantPropertyCheck.ts, 2, 16))
>x.foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 7, 14), Decl(discriminantPropertyCheck.ts, 14, 14))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 32, 14))
>foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 7, 14), Decl(discriminantPropertyCheck.ts, 14, 14))
>undefined : Symbol(undefined)

        x.foo.length;
>x.foo.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
>x.foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 7, 14), Decl(discriminantPropertyCheck.ts, 14, 14))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 32, 14))
>foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 7, 14), Decl(discriminantPropertyCheck.ts, 14, 14))
>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
    }
}

function foo2(x: Item) {
>foo2 : Symbol(foo2, Decl(discriminantPropertyCheck.ts, 36, 1))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 38, 14))
>Item : Symbol(Item, Decl(discriminantPropertyCheck.ts, 0, 0))

    if (x.foo !== undefined && x.bar) {
>x.foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 7, 14), Decl(discriminantPropertyCheck.ts, 14, 14))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 38, 14))
>foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 7, 14), Decl(discriminantPropertyCheck.ts, 14, 14))
>undefined : Symbol(undefined)
>x.bar : Symbol(Base.bar, Decl(discriminantPropertyCheck.ts, 2, 16))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 38, 14))
>bar : Symbol(Base.bar, Decl(discriminantPropertyCheck.ts, 2, 16))

        x.foo.length;
>x.foo.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
>x.foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 7, 14), Decl(discriminantPropertyCheck.ts, 14, 14))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 38, 14))
>foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 7, 14), Decl(discriminantPropertyCheck.ts, 14, 14))
>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
    }
}

function foo3(x: Item) {
>foo3 : Symbol(foo3, Decl(discriminantPropertyCheck.ts, 42, 1))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 44, 14))
>Item : Symbol(Item, Decl(discriminantPropertyCheck.ts, 0, 0))

    if (x.baz && x.foo !== undefined) {
>x.baz : Symbol(baz, Decl(discriminantPropertyCheck.ts, 8, 28), Decl(discriminantPropertyCheck.ts, 15, 28))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 44, 14))
>baz : Symbol(baz, Decl(discriminantPropertyCheck.ts, 8, 28), Decl(discriminantPropertyCheck.ts, 15, 28))
>x.foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 7, 14), Decl(discriminantPropertyCheck.ts, 14, 14))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 44, 14))
>foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 7, 14), Decl(discriminantPropertyCheck.ts, 14, 14))
>undefined : Symbol(undefined)

        x.foo.length;
>x.foo.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
>x.foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 7, 14), Decl(discriminantPropertyCheck.ts, 14, 14))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 44, 14))
>foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 7, 14), Decl(discriminantPropertyCheck.ts, 14, 14))
>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
    }
}

function foo4(x: Item) {
>foo4 : Symbol(foo4, Decl(discriminantPropertyCheck.ts, 48, 1))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 50, 14))
>Item : Symbol(Item, Decl(discriminantPropertyCheck.ts, 0, 0))

    if (x.foo !== undefined && x.baz) {
>x.foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 7, 14), Decl(discriminantPropertyCheck.ts, 14, 14))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 50, 14))
>foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 7, 14), Decl(discriminantPropertyCheck.ts, 14, 14))
>undefined : Symbol(undefined)
>x.baz : Symbol(baz, Decl(discriminantPropertyCheck.ts, 8, 28), Decl(discriminantPropertyCheck.ts, 15, 28))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 50, 14))
>baz : Symbol(baz, Decl(discriminantPropertyCheck.ts, 8, 28), Decl(discriminantPropertyCheck.ts, 15, 28))

        x.foo.length;
>x.foo.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
>x.foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 7, 14), Decl(discriminantPropertyCheck.ts, 14, 14))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 50, 14))
>foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 7, 14), Decl(discriminantPropertyCheck.ts, 14, 14))
>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
    }
}

function foo5(x: Item) {
>foo5 : Symbol(foo5, Decl(discriminantPropertyCheck.ts, 54, 1))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 56, 14))
>Item : Symbol(Item, Decl(discriminantPropertyCheck.ts, 0, 0))

    if (x.qux && x.foo !== undefined) {
>x.qux : Symbol(qux, Decl(discriminantPropertyCheck.ts, 9, 17), Decl(discriminantPropertyCheck.ts, 16, 17))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 56, 14))
>qux : Symbol(qux, Decl(discriminantPropertyCheck.ts, 9, 17), Decl(discriminantPropertyCheck.ts, 16, 17))
>x.foo : Symbol(Item1.foo, Decl(discriminantPropertyCheck.ts, 7, 14))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 56, 14))
>foo : Symbol(Item1.foo, Decl(discriminantPropertyCheck.ts, 7, 14))
>undefined : Symbol(undefined)

        x.foo.length;
>x.foo.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
>x.foo : Symbol(Item1.foo, Decl(discriminantPropertyCheck.ts, 7, 14))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 56, 14))
>foo : Symbol(Item1.foo, Decl(discriminantPropertyCheck.ts, 7, 14))
>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
    }
}

function foo6(x: Item) {
>foo6 : Symbol(foo6, Decl(discriminantPropertyCheck.ts, 60, 1))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 62, 14))
>Item : Symbol(Item, Decl(discriminantPropertyCheck.ts, 0, 0))

    if (x.foo !== undefined && x.qux) {
>x.foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 7, 14), Decl(discriminantPropertyCheck.ts, 14, 14))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 62, 14))
>foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 7, 14), Decl(discriminantPropertyCheck.ts, 14, 14))
>undefined : Symbol(undefined)
>x.qux : Symbol(qux, Decl(discriminantPropertyCheck.ts, 9, 17), Decl(discriminantPropertyCheck.ts, 16, 17))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 62, 14))
>qux : Symbol(qux, Decl(discriminantPropertyCheck.ts, 9, 17), Decl(discriminantPropertyCheck.ts, 16, 17))

        x.foo.length;  // Error, intervening discriminant guard
>x.foo.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
>x.foo : Symbol(Item1.foo, Decl(discriminantPropertyCheck.ts, 7, 14))
>x : Symbol(x, Decl(discriminantPropertyCheck.ts, 62, 14))
>foo : Symbol(Item1.foo, Decl(discriminantPropertyCheck.ts, 7, 14))
>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
    }
}

// Repro from #27493

enum Types { Str = 1, Num = 2 }
>Types : Symbol(Types, Decl(discriminantPropertyCheck.ts, 66, 1))
>Str : Symbol(Types.Str, Decl(discriminantPropertyCheck.ts, 70, 12))
>Num : Symbol(Types.Num, Decl(discriminantPropertyCheck.ts, 70, 21))

type Instance = StrType | NumType;
>Instance : Symbol(Instance, Decl(discriminantPropertyCheck.ts, 70, 31))
>StrType : Symbol(StrType, Decl(discriminantPropertyCheck.ts, 72, 34))
>NumType : Symbol(NumType, Decl(discriminantPropertyCheck.ts, 78, 1))

interface StrType {
>StrType : Symbol(StrType, Decl(discriminantPropertyCheck.ts, 72, 34))

    type: Types.Str;
>type : Symbol(StrType.type, Decl(discriminantPropertyCheck.ts, 74, 19))
>Types : Symbol(Types, Decl(discriminantPropertyCheck.ts, 66, 1))
>Str : Symbol(Types.Str, Decl(discriminantPropertyCheck.ts, 70, 12))

    value: string;
>value : Symbol(StrType.value, Decl(discriminantPropertyCheck.ts, 75, 20))

    length: number;
>length : Symbol(StrType.length, Decl(discriminantPropertyCheck.ts, 76, 18))
}

interface NumType {
>NumType : Symbol(NumType, Decl(discriminantPropertyCheck.ts, 78, 1))

    type: Types.Num;
>type : Symbol(NumType.type, Decl(discriminantPropertyCheck.ts, 80, 19))
>Types : Symbol(Types, Decl(discriminantPropertyCheck.ts, 66, 1))
>Num : Symbol(Types.Num, Decl(discriminantPropertyCheck.ts, 70, 21))

    value: number;
>value : Symbol(NumType.value, Decl(discriminantPropertyCheck.ts, 81, 20))
}

function func2(inst: Instance) {
>func2 : Symbol(func2, Decl(discriminantPropertyCheck.ts, 83, 1))
>inst : Symbol(inst, Decl(discriminantPropertyCheck.ts, 85, 15))
>Instance : Symbol(Instance, Decl(discriminantPropertyCheck.ts, 70, 31))

    while (true) {
        switch (inst.type) {
>inst.type : Symbol(type, Decl(discriminantPropertyCheck.ts, 74, 19), Decl(discriminantPropertyCheck.ts, 80, 19))
>inst : Symbol(inst, Decl(discriminantPropertyCheck.ts, 85, 15))
>type : Symbol(type, Decl(discriminantPropertyCheck.ts, 74, 19), Decl(discriminantPropertyCheck.ts, 80, 19))

            case Types.Str: {
>Types.Str : Symbol(Types.Str, Decl(discriminantPropertyCheck.ts, 70, 12))
>Types : Symbol(Types, Decl(discriminantPropertyCheck.ts, 66, 1))
>Str : Symbol(Types.Str, Decl(discriminantPropertyCheck.ts, 70, 12))

                inst.value.length;
>inst.value.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
>inst.value : Symbol(StrType.value, Decl(discriminantPropertyCheck.ts, 75, 20))
>inst : Symbol(inst, Decl(discriminantPropertyCheck.ts, 85, 15))
>value : Symbol(StrType.value, Decl(discriminantPropertyCheck.ts, 75, 20))
>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))

                break;
            }
            case Types.Num: {
>Types.Num : Symbol(Types.Num, Decl(discriminantPropertyCheck.ts, 70, 21))
>Types : Symbol(Types, Decl(discriminantPropertyCheck.ts, 66, 1))
>Num : Symbol(Types.Num, Decl(discriminantPropertyCheck.ts, 70, 21))

                inst.value.toExponential;
>inst.value.toExponential : Symbol(Number.toExponential, Decl(lib.es5.d.ts, --, --))
>inst.value : Symbol(NumType.value, Decl(discriminantPropertyCheck.ts, 81, 20))
>inst : Symbol(inst, Decl(discriminantPropertyCheck.ts, 85, 15))
>value : Symbol(NumType.value, Decl(discriminantPropertyCheck.ts, 81, 20))
>toExponential : Symbol(Number.toExponential, Decl(lib.es5.d.ts, --, --))

                break;
            }
        }
    }
}

// Repro from #29106

const f = (_a: string, _b: string): void => {};
>f : Symbol(f, Decl(discriminantPropertyCheck.ts, 102, 5))
>_a : Symbol(_a, Decl(discriminantPropertyCheck.ts, 102, 11))
>_b : Symbol(_b, Decl(discriminantPropertyCheck.ts, 102, 22))

interface A {
>A : Symbol(A, Decl(discriminantPropertyCheck.ts, 102, 47))

  a?: string;
>a : Symbol(A.a, Decl(discriminantPropertyCheck.ts, 104, 13))

  b?: string;
>b : Symbol(A.b, Decl(discriminantPropertyCheck.ts, 105, 13))
}

interface B {
>B : Symbol(B, Decl(discriminantPropertyCheck.ts, 107, 1))

  a: string;
>a : Symbol(B.a, Decl(discriminantPropertyCheck.ts, 109, 13))

  b: string;
>b : Symbol(B.b, Decl(discriminantPropertyCheck.ts, 110, 12))
}

type U = A | B;
>U : Symbol(U, Decl(discriminantPropertyCheck.ts, 112, 1))
>A : Symbol(A, Decl(discriminantPropertyCheck.ts, 102, 47))
>B : Symbol(B, Decl(discriminantPropertyCheck.ts, 107, 1))

const u: U = {} as any;
>u : Symbol(u, Decl(discriminantPropertyCheck.ts, 116, 5))
>U : Symbol(U, Decl(discriminantPropertyCheck.ts, 112, 1))

u.a && u.b && f(u.a, u.b);
>u.a : Symbol(a, Decl(discriminantPropertyCheck.ts, 104, 13), Decl(discriminantPropertyCheck.ts, 109, 13))
>u : Symbol(u, Decl(discriminantPropertyCheck.ts, 116, 5))
>a : Symbol(a, Decl(discriminantPropertyCheck.ts, 104, 13), Decl(discriminantPropertyCheck.ts, 109, 13))
>u.b : Symbol(b, Decl(discriminantPropertyCheck.ts, 105, 13), Decl(discriminantPropertyCheck.ts, 110, 12))
>u : Symbol(u, Decl(discriminantPropertyCheck.ts, 116, 5))
>b : Symbol(b, Decl(discriminantPropertyCheck.ts, 105, 13), Decl(discriminantPropertyCheck.ts, 110, 12))
>f : Symbol(f, Decl(discriminantPropertyCheck.ts, 102, 5))
>u.a : Symbol(a, Decl(discriminantPropertyCheck.ts, 104, 13), Decl(discriminantPropertyCheck.ts, 109, 13))
>u : Symbol(u, Decl(discriminantPropertyCheck.ts, 116, 5))
>a : Symbol(a, Decl(discriminantPropertyCheck.ts, 104, 13), Decl(discriminantPropertyCheck.ts, 109, 13))
>u.b : Symbol(b, Decl(discriminantPropertyCheck.ts, 105, 13), Decl(discriminantPropertyCheck.ts, 110, 12))
>u : Symbol(u, Decl(discriminantPropertyCheck.ts, 116, 5))
>b : Symbol(b, Decl(discriminantPropertyCheck.ts, 105, 13), Decl(discriminantPropertyCheck.ts, 110, 12))

u.b && u.a && f(u.a, u.b);
>u.b : Symbol(b, Decl(discriminantPropertyCheck.ts, 105, 13), Decl(discriminantPropertyCheck.ts, 110, 12))
>u : Symbol(u, Decl(discriminantPropertyCheck.ts, 116, 5))
>b : Symbol(b, Decl(discriminantPropertyCheck.ts, 105, 13), Decl(discriminantPropertyCheck.ts, 110, 12))
>u.a : Symbol(a, Decl(discriminantPropertyCheck.ts, 104, 13), Decl(discriminantPropertyCheck.ts, 109, 13))
>u : Symbol(u, Decl(discriminantPropertyCheck.ts, 116, 5))
>a : Symbol(a, Decl(discriminantPropertyCheck.ts, 104, 13), Decl(discriminantPropertyCheck.ts, 109, 13))
>f : Symbol(f, Decl(discriminantPropertyCheck.ts, 102, 5))
>u.a : Symbol(a, Decl(discriminantPropertyCheck.ts, 104, 13), Decl(discriminantPropertyCheck.ts, 109, 13))
>u : Symbol(u, Decl(discriminantPropertyCheck.ts, 116, 5))
>a : Symbol(a, Decl(discriminantPropertyCheck.ts, 104, 13), Decl(discriminantPropertyCheck.ts, 109, 13))
>u.b : Symbol(b, Decl(discriminantPropertyCheck.ts, 105, 13), Decl(discriminantPropertyCheck.ts, 110, 12))
>u : Symbol(u, Decl(discriminantPropertyCheck.ts, 116, 5))
>b : Symbol(b, Decl(discriminantPropertyCheck.ts, 105, 13), Decl(discriminantPropertyCheck.ts, 110, 12))

// Repro from #29012

type Additive = '+' | '-';
>Additive : Symbol(Additive, Decl(discriminantPropertyCheck.ts, 120, 26))

type Multiplicative = '*' | '/';
>Multiplicative : Symbol(Multiplicative, Decl(discriminantPropertyCheck.ts, 124, 26))

interface AdditiveObj {
>AdditiveObj : Symbol(AdditiveObj, Decl(discriminantPropertyCheck.ts, 125, 32))

    key: Additive
>key : Symbol(AdditiveObj.key, Decl(discriminantPropertyCheck.ts, 127, 23))
>Additive : Symbol(Additive, Decl(discriminantPropertyCheck.ts, 120, 26))
}

interface MultiplicativeObj {
>MultiplicativeObj : Symbol(MultiplicativeObj, Decl(discriminantPropertyCheck.ts, 129, 1))

    key: Multiplicative
>key : Symbol(MultiplicativeObj.key, Decl(discriminantPropertyCheck.ts, 131, 29))
>Multiplicative : Symbol(Multiplicative, Decl(discriminantPropertyCheck.ts, 124, 26))
}

type Obj = AdditiveObj | MultiplicativeObj
>Obj : Symbol(Obj, Decl(discriminantPropertyCheck.ts, 133, 1))
>AdditiveObj : Symbol(AdditiveObj, Decl(discriminantPropertyCheck.ts, 125, 32))
>MultiplicativeObj : Symbol(MultiplicativeObj, Decl(discriminantPropertyCheck.ts, 129, 1))

export function foo(obj: Obj) {
>foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 135, 42))
>obj : Symbol(obj, Decl(discriminantPropertyCheck.ts, 137, 20))
>Obj : Symbol(Obj, Decl(discriminantPropertyCheck.ts, 133, 1))

    switch (obj.key) {
>obj.key : Symbol(key, Decl(discriminantPropertyCheck.ts, 127, 23), Decl(discriminantPropertyCheck.ts, 131, 29))
>obj : Symbol(obj, Decl(discriminantPropertyCheck.ts, 137, 20))
>key : Symbol(key, Decl(discriminantPropertyCheck.ts, 127, 23), Decl(discriminantPropertyCheck.ts, 131, 29))

        case '+': {
            onlyPlus(obj.key);
>onlyPlus : Symbol(onlyPlus, Decl(discriminantPropertyCheck.ts, 144, 1))
>obj.key : Symbol(AdditiveObj.key, Decl(discriminantPropertyCheck.ts, 127, 23))
>obj : Symbol(obj, Decl(discriminantPropertyCheck.ts, 137, 20))
>key : Symbol(AdditiveObj.key, Decl(discriminantPropertyCheck.ts, 127, 23))

            return;
        }
    }
}

function onlyPlus(arg: '+') {
>onlyPlus : Symbol(onlyPlus, Decl(discriminantPropertyCheck.ts, 144, 1))
>arg : Symbol(arg, Decl(discriminantPropertyCheck.ts, 146, 18))

  return arg;
>arg : Symbol(arg, Decl(discriminantPropertyCheck.ts, 146, 18))
}

// Repro from #29496

declare function never(value: never): never;
>never : Symbol(never, Decl(discriminantPropertyCheck.ts, 148, 1))
>value : Symbol(value, Decl(discriminantPropertyCheck.ts, 152, 23))

const enum BarEnum {
>BarEnum : Symbol(BarEnum, Decl(discriminantPropertyCheck.ts, 152, 44))

    bar1 = 1,
>bar1 : Symbol(BarEnum.bar1, Decl(discriminantPropertyCheck.ts, 154, 20))

    bar2 = 2,
>bar2 : Symbol(BarEnum.bar2, Decl(discriminantPropertyCheck.ts, 155, 13))
}

type UnionOfBar = TypeBar1 | TypeBar2;
>UnionOfBar : Symbol(UnionOfBar, Decl(discriminantPropertyCheck.ts, 157, 1))
>TypeBar1 : Symbol(TypeBar1, Decl(discriminantPropertyCheck.ts, 159, 38))
>TypeBar2 : Symbol(TypeBar2, Decl(discriminantPropertyCheck.ts, 160, 39))

type TypeBar1 = { type: BarEnum.bar1 };
>TypeBar1 : Symbol(TypeBar1, Decl(discriminantPropertyCheck.ts, 159, 38))
>type : Symbol(type, Decl(discriminantPropertyCheck.ts, 160, 17))
>BarEnum : Symbol(BarEnum, Decl(discriminantPropertyCheck.ts, 152, 44))
>bar1 : Symbol(BarEnum.bar1, Decl(discriminantPropertyCheck.ts, 154, 20))

type TypeBar2 = { type: BarEnum.bar2 };
>TypeBar2 : Symbol(TypeBar2, Decl(discriminantPropertyCheck.ts, 160, 39))
>type : Symbol(type, Decl(discriminantPropertyCheck.ts, 161, 17))
>BarEnum : Symbol(BarEnum, Decl(discriminantPropertyCheck.ts, 152, 44))
>bar2 : Symbol(BarEnum.bar2, Decl(discriminantPropertyCheck.ts, 155, 13))

function func3(value: Partial<UnionOfBar>) {
>func3 : Symbol(func3, Decl(discriminantPropertyCheck.ts, 161, 39))
>value : Symbol(value, Decl(discriminantPropertyCheck.ts, 163, 15))
>Partial : Symbol(Partial, Decl(lib.es5.d.ts, --, --))
>UnionOfBar : Symbol(UnionOfBar, Decl(discriminantPropertyCheck.ts, 157, 1))

    if (value.type !== undefined) {
>value.type : Symbol(type, Decl(discriminantPropertyCheck.ts, 160, 17), Decl(discriminantPropertyCheck.ts, 161, 17))
>value : Symbol(value, Decl(discriminantPropertyCheck.ts, 163, 15))
>type : Symbol(type, Decl(discriminantPropertyCheck.ts, 160, 17), Decl(discriminantPropertyCheck.ts, 161, 17))
>undefined : Symbol(undefined)

        switch (value.type) {
>value.type : Symbol(type, Decl(discriminantPropertyCheck.ts, 160, 17), Decl(discriminantPropertyCheck.ts, 161, 17))
>value : Symbol(value, Decl(discriminantPropertyCheck.ts, 163, 15))
>type : Symbol(type, Decl(discriminantPropertyCheck.ts, 160, 17), Decl(discriminantPropertyCheck.ts, 161, 17))

            case BarEnum.bar1:
>BarEnum.bar1 : Symbol(BarEnum.bar1, Decl(discriminantPropertyCheck.ts, 154, 20))
>BarEnum : Symbol(BarEnum, Decl(discriminantPropertyCheck.ts, 152, 44))
>bar1 : Symbol(BarEnum.bar1, Decl(discriminantPropertyCheck.ts, 154, 20))

                break;
            case BarEnum.bar2:
>BarEnum.bar2 : Symbol(BarEnum.bar2, Decl(discriminantPropertyCheck.ts, 155, 13))
>BarEnum : Symbol(BarEnum, Decl(discriminantPropertyCheck.ts, 152, 44))
>bar2 : Symbol(BarEnum.bar2, Decl(discriminantPropertyCheck.ts, 155, 13))

                break;
            default:
                never(value.type);
>never : Symbol(never, Decl(discriminantPropertyCheck.ts, 148, 1))
>value.type : Symbol(type, Decl(discriminantPropertyCheck.ts, 160, 17), Decl(discriminantPropertyCheck.ts, 161, 17))
>value : Symbol(value, Decl(discriminantPropertyCheck.ts, 163, 15))
>type : Symbol(type, Decl(discriminantPropertyCheck.ts, 160, 17), Decl(discriminantPropertyCheck.ts, 161, 17))
        }
    }
}