@@ -377,3 +377,134 @@ u.b && u.a && f(u.a, u.b);
377377>u : Symbol(u, Decl(discriminantPropertyCheck.ts, 116, 5))
378378>b : Symbol(b, Decl(discriminantPropertyCheck.ts, 105, 13), Decl(discriminantPropertyCheck.ts, 110, 12))
379379
380+ // Repro from #29012
381+
382+ type Additive = '+' | '-';
383+ >Additive : Symbol(Additive, Decl(discriminantPropertyCheck.ts, 120, 26))
384+
385+ type Multiplicative = '*' | '/';
386+ >Multiplicative : Symbol(Multiplicative, Decl(discriminantPropertyCheck.ts, 124, 26))
387+
388+ interface AdditiveObj {
389+ >AdditiveObj : Symbol(AdditiveObj, Decl(discriminantPropertyCheck.ts, 125, 32))
390+
391+ key: Additive
392+ >key : Symbol(AdditiveObj.key, Decl(discriminantPropertyCheck.ts, 127, 23))
393+ >Additive : Symbol(Additive, Decl(discriminantPropertyCheck.ts, 120, 26))
394+ }
395+
396+ interface MultiplicativeObj {
397+ >MultiplicativeObj : Symbol(MultiplicativeObj, Decl(discriminantPropertyCheck.ts, 129, 1))
398+
399+ key: Multiplicative
400+ >key : Symbol(MultiplicativeObj.key, Decl(discriminantPropertyCheck.ts, 131, 29))
401+ >Multiplicative : Symbol(Multiplicative, Decl(discriminantPropertyCheck.ts, 124, 26))
402+ }
403+
404+ type Obj = AdditiveObj | MultiplicativeObj
405+ >Obj : Symbol(Obj, Decl(discriminantPropertyCheck.ts, 133, 1))
406+ >AdditiveObj : Symbol(AdditiveObj, Decl(discriminantPropertyCheck.ts, 125, 32))
407+ >MultiplicativeObj : Symbol(MultiplicativeObj, Decl(discriminantPropertyCheck.ts, 129, 1))
408+
409+ export function foo(obj: Obj) {
410+ >foo : Symbol(foo, Decl(discriminantPropertyCheck.ts, 135, 42))
411+ >obj : Symbol(obj, Decl(discriminantPropertyCheck.ts, 137, 20))
412+ >Obj : Symbol(Obj, Decl(discriminantPropertyCheck.ts, 133, 1))
413+
414+ switch (obj.key) {
415+ >obj.key : Symbol(key, Decl(discriminantPropertyCheck.ts, 127, 23), Decl(discriminantPropertyCheck.ts, 131, 29))
416+ >obj : Symbol(obj, Decl(discriminantPropertyCheck.ts, 137, 20))
417+ >key : Symbol(key, Decl(discriminantPropertyCheck.ts, 127, 23), Decl(discriminantPropertyCheck.ts, 131, 29))
418+
419+ case '+': {
420+ onlyPlus(obj.key);
421+ >onlyPlus : Symbol(onlyPlus, Decl(discriminantPropertyCheck.ts, 144, 1))
422+ >obj.key : Symbol(AdditiveObj.key, Decl(discriminantPropertyCheck.ts, 127, 23))
423+ >obj : Symbol(obj, Decl(discriminantPropertyCheck.ts, 137, 20))
424+ >key : Symbol(AdditiveObj.key, Decl(discriminantPropertyCheck.ts, 127, 23))
425+
426+ return;
427+ }
428+ }
429+ }
430+
431+ function onlyPlus(arg: '+') {
432+ >onlyPlus : Symbol(onlyPlus, Decl(discriminantPropertyCheck.ts, 144, 1))
433+ >arg : Symbol(arg, Decl(discriminantPropertyCheck.ts, 146, 18))
434+
435+ return arg;
436+ >arg : Symbol(arg, Decl(discriminantPropertyCheck.ts, 146, 18))
437+ }
438+
439+ // Repro from #29496
440+
441+ declare function never(value: never): never;
442+ >never : Symbol(never, Decl(discriminantPropertyCheck.ts, 148, 1))
443+ >value : Symbol(value, Decl(discriminantPropertyCheck.ts, 152, 23))
444+
445+ const enum BarEnum {
446+ >BarEnum : Symbol(BarEnum, Decl(discriminantPropertyCheck.ts, 152, 44))
447+
448+ bar1 = 1,
449+ >bar1 : Symbol(BarEnum.bar1, Decl(discriminantPropertyCheck.ts, 154, 20))
450+
451+ bar2 = 2,
452+ >bar2 : Symbol(BarEnum.bar2, Decl(discriminantPropertyCheck.ts, 155, 13))
453+ }
454+
455+ type UnionOfBar = TypeBar1 | TypeBar2;
456+ >UnionOfBar : Symbol(UnionOfBar, Decl(discriminantPropertyCheck.ts, 157, 1))
457+ >TypeBar1 : Symbol(TypeBar1, Decl(discriminantPropertyCheck.ts, 159, 38))
458+ >TypeBar2 : Symbol(TypeBar2, Decl(discriminantPropertyCheck.ts, 160, 39))
459+
460+ type TypeBar1 = { type: BarEnum.bar1 };
461+ >TypeBar1 : Symbol(TypeBar1, Decl(discriminantPropertyCheck.ts, 159, 38))
462+ >type : Symbol(type, Decl(discriminantPropertyCheck.ts, 160, 17))
463+ >BarEnum : Symbol(BarEnum, Decl(discriminantPropertyCheck.ts, 152, 44))
464+ >bar1 : Symbol(BarEnum.bar1, Decl(discriminantPropertyCheck.ts, 154, 20))
465+
466+ type TypeBar2 = { type: BarEnum.bar2 };
467+ >TypeBar2 : Symbol(TypeBar2, Decl(discriminantPropertyCheck.ts, 160, 39))
468+ >type : Symbol(type, Decl(discriminantPropertyCheck.ts, 161, 17))
469+ >BarEnum : Symbol(BarEnum, Decl(discriminantPropertyCheck.ts, 152, 44))
470+ >bar2 : Symbol(BarEnum.bar2, Decl(discriminantPropertyCheck.ts, 155, 13))
471+
472+ function func3(value: Partial<UnionOfBar>) {
473+ >func3 : Symbol(func3, Decl(discriminantPropertyCheck.ts, 161, 39))
474+ >value : Symbol(value, Decl(discriminantPropertyCheck.ts, 163, 15))
475+ >Partial : Symbol(Partial, Decl(lib.es5.d.ts, --, --))
476+ >UnionOfBar : Symbol(UnionOfBar, Decl(discriminantPropertyCheck.ts, 157, 1))
477+
478+ if (value.type !== undefined) {
479+ >value.type : Symbol(type, Decl(discriminantPropertyCheck.ts, 160, 17), Decl(discriminantPropertyCheck.ts, 161, 17))
480+ >value : Symbol(value, Decl(discriminantPropertyCheck.ts, 163, 15))
481+ >type : Symbol(type, Decl(discriminantPropertyCheck.ts, 160, 17), Decl(discriminantPropertyCheck.ts, 161, 17))
482+ >undefined : Symbol(undefined)
483+
484+ switch (value.type) {
485+ >value.type : Symbol(type, Decl(discriminantPropertyCheck.ts, 160, 17), Decl(discriminantPropertyCheck.ts, 161, 17))
486+ >value : Symbol(value, Decl(discriminantPropertyCheck.ts, 163, 15))
487+ >type : Symbol(type, Decl(discriminantPropertyCheck.ts, 160, 17), Decl(discriminantPropertyCheck.ts, 161, 17))
488+
489+ case BarEnum.bar1:
490+ >BarEnum.bar1 : Symbol(BarEnum.bar1, Decl(discriminantPropertyCheck.ts, 154, 20))
491+ >BarEnum : Symbol(BarEnum, Decl(discriminantPropertyCheck.ts, 152, 44))
492+ >bar1 : Symbol(BarEnum.bar1, Decl(discriminantPropertyCheck.ts, 154, 20))
493+
494+ break;
495+ case BarEnum.bar2:
496+ >BarEnum.bar2 : Symbol(BarEnum.bar2, Decl(discriminantPropertyCheck.ts, 155, 13))
497+ >BarEnum : Symbol(BarEnum, Decl(discriminantPropertyCheck.ts, 152, 44))
498+ >bar2 : Symbol(BarEnum.bar2, Decl(discriminantPropertyCheck.ts, 155, 13))
499+
500+ break;
501+ default:
502+ never(value.type);
503+ >never : Symbol(never, Decl(discriminantPropertyCheck.ts, 148, 1))
504+ >value.type : Symbol(type, Decl(discriminantPropertyCheck.ts, 160, 17), Decl(discriminantPropertyCheck.ts, 161, 17))
505+ >value : Symbol(value, Decl(discriminantPropertyCheck.ts, 163, 15))
506+ >type : Symbol(type, Decl(discriminantPropertyCheck.ts, 160, 17), Decl(discriminantPropertyCheck.ts, 161, 17))
507+ }
508+ }
509+ }
510+
0 commit comments