@@ -508,3 +508,159 @@ function func3(value: Partial<UnionOfBar>) {
508508 }
509509}
510510
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