@@ -508,3 +508,159 @@ function func3(value: Partial<UnionOfBar>) {
508
508
}
509
509
}
510
510
511
+ // Repro from #30557
512
+
513
+ interface TypeA {
514
+ >TypeA : Symbol(TypeA, Decl(discriminantPropertyCheck.ts, 174, 1))
515
+
516
+ Name: "TypeA";
517
+ >Name : Symbol(TypeA.Name, Decl(discriminantPropertyCheck.ts, 178, 17))
518
+
519
+ Value1: "Cool stuff!";
520
+ >Value1 : Symbol(TypeA.Value1, Decl(discriminantPropertyCheck.ts, 179, 18))
521
+ }
522
+
523
+ interface TypeB {
524
+ >TypeB : Symbol(TypeB, Decl(discriminantPropertyCheck.ts, 181, 1))
525
+
526
+ Name: "TypeB";
527
+ >Name : Symbol(TypeB.Name, Decl(discriminantPropertyCheck.ts, 183, 17))
528
+
529
+ Value2: 0;
530
+ >Value2 : Symbol(TypeB.Value2, Decl(discriminantPropertyCheck.ts, 184, 18))
531
+ }
532
+
533
+ type Type = TypeA | TypeB;
534
+ >Type : Symbol(Type, Decl(discriminantPropertyCheck.ts, 186, 1))
535
+ >TypeA : Symbol(TypeA, Decl(discriminantPropertyCheck.ts, 174, 1))
536
+ >TypeB : Symbol(TypeB, Decl(discriminantPropertyCheck.ts, 181, 1))
537
+
538
+ declare function isType(x: unknown): x is Type;
539
+ >isType : Symbol(isType, Decl(discriminantPropertyCheck.ts, 188, 26))
540
+ >x : Symbol(x, Decl(discriminantPropertyCheck.ts, 190, 24))
541
+ >x : Symbol(x, Decl(discriminantPropertyCheck.ts, 190, 24))
542
+ >Type : Symbol(Type, Decl(discriminantPropertyCheck.ts, 186, 1))
543
+
544
+ function WorksProperly(data: Type) {
545
+ >WorksProperly : Symbol(WorksProperly, Decl(discriminantPropertyCheck.ts, 190, 47))
546
+ >data : Symbol(data, Decl(discriminantPropertyCheck.ts, 192, 23))
547
+ >Type : Symbol(Type, Decl(discriminantPropertyCheck.ts, 186, 1))
548
+
549
+ if (data.Name === "TypeA") {
550
+ >data.Name : Symbol(Name, Decl(discriminantPropertyCheck.ts, 178, 17), Decl(discriminantPropertyCheck.ts, 183, 17))
551
+ >data : Symbol(data, Decl(discriminantPropertyCheck.ts, 192, 23))
552
+ >Name : Symbol(Name, Decl(discriminantPropertyCheck.ts, 178, 17), Decl(discriminantPropertyCheck.ts, 183, 17))
553
+
554
+ const value1 = data.Value1;
555
+ >value1 : Symbol(value1, Decl(discriminantPropertyCheck.ts, 194, 13))
556
+ >data.Value1 : Symbol(TypeA.Value1, Decl(discriminantPropertyCheck.ts, 179, 18))
557
+ >data : Symbol(data, Decl(discriminantPropertyCheck.ts, 192, 23))
558
+ >Value1 : Symbol(TypeA.Value1, Decl(discriminantPropertyCheck.ts, 179, 18))
559
+ }
560
+ }
561
+
562
+ function DoesNotWork(data: unknown) {
563
+ >DoesNotWork : Symbol(DoesNotWork, Decl(discriminantPropertyCheck.ts, 196, 1))
564
+ >data : Symbol(data, Decl(discriminantPropertyCheck.ts, 198, 21))
565
+
566
+ if (isType(data)) {
567
+ >isType : Symbol(isType, Decl(discriminantPropertyCheck.ts, 188, 26))
568
+ >data : Symbol(data, Decl(discriminantPropertyCheck.ts, 198, 21))
569
+
570
+ if (data.Name === "TypeA") {
571
+ >data.Name : Symbol(Name, Decl(discriminantPropertyCheck.ts, 178, 17), Decl(discriminantPropertyCheck.ts, 183, 17))
572
+ >data : Symbol(data, Decl(discriminantPropertyCheck.ts, 198, 21))
573
+ >Name : Symbol(Name, Decl(discriminantPropertyCheck.ts, 178, 17), Decl(discriminantPropertyCheck.ts, 183, 17))
574
+
575
+ const value1 = data.Value1;
576
+ >value1 : Symbol(value1, Decl(discriminantPropertyCheck.ts, 201, 17))
577
+ >data.Value1 : Symbol(TypeA.Value1, Decl(discriminantPropertyCheck.ts, 179, 18))
578
+ >data : Symbol(data, Decl(discriminantPropertyCheck.ts, 198, 21))
579
+ >Value1 : Symbol(TypeA.Value1, Decl(discriminantPropertyCheck.ts, 179, 18))
580
+ }
581
+ }
582
+ }
583
+
584
+ // Repro from #36777
585
+
586
+ type TestA = {
587
+ >TestA : Symbol(TestA, Decl(discriminantPropertyCheck.ts, 204, 1))
588
+
589
+ type: 'testA';
590
+ >type : Symbol(type, Decl(discriminantPropertyCheck.ts, 208, 14))
591
+
592
+ bananas: 3;
593
+ >bananas : Symbol(bananas, Decl(discriminantPropertyCheck.ts, 209, 18))
594
+ }
595
+
596
+ type TestB = {
597
+ >TestB : Symbol(TestB, Decl(discriminantPropertyCheck.ts, 211, 1))
598
+
599
+ type: 'testB';
600
+ >type : Symbol(type, Decl(discriminantPropertyCheck.ts, 213, 14))
601
+
602
+ apples: 5;
603
+ >apples : Symbol(apples, Decl(discriminantPropertyCheck.ts, 214, 18))
604
+ }
605
+
606
+ type AllTests = TestA | TestB;
607
+ >AllTests : Symbol(AllTests, Decl(discriminantPropertyCheck.ts, 216, 1))
608
+ >TestA : Symbol(TestA, Decl(discriminantPropertyCheck.ts, 204, 1))
609
+ >TestB : Symbol(TestB, Decl(discriminantPropertyCheck.ts, 211, 1))
610
+
611
+ type MapOfAllTests = Record<string, AllTests>;
612
+ >MapOfAllTests : Symbol(MapOfAllTests, Decl(discriminantPropertyCheck.ts, 218, 30))
613
+ >Record : Symbol(Record, Decl(lib.es5.d.ts, --, --))
614
+ >AllTests : Symbol(AllTests, Decl(discriminantPropertyCheck.ts, 216, 1))
615
+
616
+ const doTestingStuff = (mapOfTests: MapOfAllTests, ids: string[]) => {
617
+ >doTestingStuff : Symbol(doTestingStuff, Decl(discriminantPropertyCheck.ts, 222, 5))
618
+ >mapOfTests : Symbol(mapOfTests, Decl(discriminantPropertyCheck.ts, 222, 24))
619
+ >MapOfAllTests : Symbol(MapOfAllTests, Decl(discriminantPropertyCheck.ts, 218, 30))
620
+ >ids : Symbol(ids, Decl(discriminantPropertyCheck.ts, 222, 50))
621
+
622
+ ids.forEach(id => {
623
+ >ids.forEach : Symbol(Array.forEach, Decl(lib.es5.d.ts, --, --))
624
+ >ids : Symbol(ids, Decl(discriminantPropertyCheck.ts, 222, 50))
625
+ >forEach : Symbol(Array.forEach, Decl(lib.es5.d.ts, --, --))
626
+ >id : Symbol(id, Decl(discriminantPropertyCheck.ts, 223, 16))
627
+
628
+ let test;
629
+ >test : Symbol(test, Decl(discriminantPropertyCheck.ts, 224, 11))
630
+
631
+ test = mapOfTests[id];
632
+ >test : Symbol(test, Decl(discriminantPropertyCheck.ts, 224, 11))
633
+ >mapOfTests : Symbol(mapOfTests, Decl(discriminantPropertyCheck.ts, 222, 24))
634
+ >id : Symbol(id, Decl(discriminantPropertyCheck.ts, 223, 16))
635
+
636
+ if (test.type === 'testA') {
637
+ >test.type : Symbol(type, Decl(discriminantPropertyCheck.ts, 208, 14), Decl(discriminantPropertyCheck.ts, 213, 14))
638
+ >test : Symbol(test, Decl(discriminantPropertyCheck.ts, 224, 11))
639
+ >type : Symbol(type, Decl(discriminantPropertyCheck.ts, 208, 14), Decl(discriminantPropertyCheck.ts, 213, 14))
640
+
641
+ console.log(test.bananas);
642
+ >console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
643
+ >console : Symbol(console, Decl(lib.dom.d.ts, --, --))
644
+ >log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
645
+ >test.bananas : Symbol(bananas, Decl(discriminantPropertyCheck.ts, 209, 18))
646
+ >test : Symbol(test, Decl(discriminantPropertyCheck.ts, 224, 11))
647
+ >bananas : Symbol(bananas, Decl(discriminantPropertyCheck.ts, 209, 18))
648
+ }
649
+ switch (test.type) {
650
+ >test.type : Symbol(type, Decl(discriminantPropertyCheck.ts, 208, 14), Decl(discriminantPropertyCheck.ts, 213, 14))
651
+ >test : Symbol(test, Decl(discriminantPropertyCheck.ts, 224, 11))
652
+ >type : Symbol(type, Decl(discriminantPropertyCheck.ts, 208, 14), Decl(discriminantPropertyCheck.ts, 213, 14))
653
+
654
+ case 'testA': {
655
+ console.log(test.bananas);
656
+ >console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
657
+ >console : Symbol(console, Decl(lib.dom.d.ts, --, --))
658
+ >log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
659
+ >test.bananas : Symbol(bananas, Decl(discriminantPropertyCheck.ts, 209, 18))
660
+ >test : Symbol(test, Decl(discriminantPropertyCheck.ts, 224, 11))
661
+ >bananas : Symbol(bananas, Decl(discriminantPropertyCheck.ts, 209, 18))
662
+ }
663
+ }
664
+ });
665
+ };
666
+
0 commit comments