diff --git a/tests/baselines/reference/discriminantPropertyCheck.errors.txt b/tests/baselines/reference/discriminantPropertyCheck.errors.txt index 313116edde5..a59b89de9de 100644 --- a/tests/baselines/reference/discriminantPropertyCheck.errors.txt +++ b/tests/baselines/reference/discriminantPropertyCheck.errors.txt @@ -128,4 +128,30 @@ tests/cases/compiler/discriminantPropertyCheck.ts(65,9): error TS2532: Object is u.a && u.b && f(u.a, u.b); u.b && u.a && f(u.a, u.b); + + // Repro from #29496 + + declare function never(value: never): never; + + const enum BarEnum { + bar1 = 1, + bar2 = 2, + } + + type UnionOfBar = TypeBar1 | TypeBar2; + type TypeBar1 = { type: BarEnum.bar1 }; + type TypeBar2 = { type: BarEnum.bar2 }; + + function func3(value: Partial) { + if (value.type !== undefined) { + switch (value.type) { + case BarEnum.bar1: + break; + case BarEnum.bar2: + break; + default: + never(value.type); + } + } + } \ No newline at end of file diff --git a/tests/baselines/reference/discriminantPropertyCheck.js b/tests/baselines/reference/discriminantPropertyCheck.js index 8b2c6f122bc..2b7c842e0b1 100644 --- a/tests/baselines/reference/discriminantPropertyCheck.js +++ b/tests/baselines/reference/discriminantPropertyCheck.js @@ -120,6 +120,32 @@ const u: U = {} as any; u.a && u.b && f(u.a, u.b); u.b && u.a && f(u.a, u.b); + +// Repro from #29496 + +declare function never(value: never): never; + +const enum BarEnum { + bar1 = 1, + bar2 = 2, +} + +type UnionOfBar = TypeBar1 | TypeBar2; +type TypeBar1 = { type: BarEnum.bar1 }; +type TypeBar2 = { type: BarEnum.bar2 }; + +function func3(value: Partial) { + if (value.type !== undefined) { + switch (value.type) { + case BarEnum.bar1: + break; + case BarEnum.bar2: + break; + default: + never(value.type); + } + } +} //// [discriminantPropertyCheck.js] @@ -188,3 +214,15 @@ var f = function (_a, _b) { }; var u = {}; u.a && u.b && f(u.a, u.b); u.b && u.a && f(u.a, u.b); +function func3(value) { + if (value.type !== undefined) { + switch (value.type) { + case 1 /* bar1 */: + break; + case 2 /* bar2 */: + break; + default: + never(value.type); + } + } +} diff --git a/tests/baselines/reference/discriminantPropertyCheck.symbols b/tests/baselines/reference/discriminantPropertyCheck.symbols index 78884eaf69f..8a906adec13 100644 --- a/tests/baselines/reference/discriminantPropertyCheck.symbols +++ b/tests/baselines/reference/discriminantPropertyCheck.symbols @@ -377,3 +377,75 @@ u.b && u.a && f(u.a, u.b); >u : Symbol(u, Decl(discriminantPropertyCheck.ts, 116, 5)) >b : Symbol(b, Decl(discriminantPropertyCheck.ts, 105, 13), Decl(discriminantPropertyCheck.ts, 110, 12)) +// Repro from #29496 + +declare function never(value: never): never; +>never : Symbol(never, Decl(discriminantPropertyCheck.ts, 120, 26)) +>value : Symbol(value, Decl(discriminantPropertyCheck.ts, 124, 23)) + +const enum BarEnum { +>BarEnum : Symbol(BarEnum, Decl(discriminantPropertyCheck.ts, 124, 44)) + + bar1 = 1, +>bar1 : Symbol(BarEnum.bar1, Decl(discriminantPropertyCheck.ts, 126, 20)) + + bar2 = 2, +>bar2 : Symbol(BarEnum.bar2, Decl(discriminantPropertyCheck.ts, 127, 13)) +} + +type UnionOfBar = TypeBar1 | TypeBar2; +>UnionOfBar : Symbol(UnionOfBar, Decl(discriminantPropertyCheck.ts, 129, 1)) +>TypeBar1 : Symbol(TypeBar1, Decl(discriminantPropertyCheck.ts, 131, 38)) +>TypeBar2 : Symbol(TypeBar2, Decl(discriminantPropertyCheck.ts, 132, 39)) + +type TypeBar1 = { type: BarEnum.bar1 }; +>TypeBar1 : Symbol(TypeBar1, Decl(discriminantPropertyCheck.ts, 131, 38)) +>type : Symbol(type, Decl(discriminantPropertyCheck.ts, 132, 17)) +>BarEnum : Symbol(BarEnum, Decl(discriminantPropertyCheck.ts, 124, 44)) +>bar1 : Symbol(BarEnum.bar1, Decl(discriminantPropertyCheck.ts, 126, 20)) + +type TypeBar2 = { type: BarEnum.bar2 }; +>TypeBar2 : Symbol(TypeBar2, Decl(discriminantPropertyCheck.ts, 132, 39)) +>type : Symbol(type, Decl(discriminantPropertyCheck.ts, 133, 17)) +>BarEnum : Symbol(BarEnum, Decl(discriminantPropertyCheck.ts, 124, 44)) +>bar2 : Symbol(BarEnum.bar2, Decl(discriminantPropertyCheck.ts, 127, 13)) + +function func3(value: Partial) { +>func3 : Symbol(func3, Decl(discriminantPropertyCheck.ts, 133, 39)) +>value : Symbol(value, Decl(discriminantPropertyCheck.ts, 135, 15)) +>Partial : Symbol(Partial, Decl(lib.es5.d.ts, --, --)) +>UnionOfBar : Symbol(UnionOfBar, Decl(discriminantPropertyCheck.ts, 129, 1)) + + if (value.type !== undefined) { +>value.type : Symbol(type, Decl(discriminantPropertyCheck.ts, 132, 17), Decl(discriminantPropertyCheck.ts, 133, 17)) +>value : Symbol(value, Decl(discriminantPropertyCheck.ts, 135, 15)) +>type : Symbol(type, Decl(discriminantPropertyCheck.ts, 132, 17), Decl(discriminantPropertyCheck.ts, 133, 17)) +>undefined : Symbol(undefined) + + switch (value.type) { +>value.type : Symbol(type, Decl(discriminantPropertyCheck.ts, 132, 17), Decl(discriminantPropertyCheck.ts, 133, 17)) +>value : Symbol(value, Decl(discriminantPropertyCheck.ts, 135, 15)) +>type : Symbol(type, Decl(discriminantPropertyCheck.ts, 132, 17), Decl(discriminantPropertyCheck.ts, 133, 17)) + + case BarEnum.bar1: +>BarEnum.bar1 : Symbol(BarEnum.bar1, Decl(discriminantPropertyCheck.ts, 126, 20)) +>BarEnum : Symbol(BarEnum, Decl(discriminantPropertyCheck.ts, 124, 44)) +>bar1 : Symbol(BarEnum.bar1, Decl(discriminantPropertyCheck.ts, 126, 20)) + + break; + case BarEnum.bar2: +>BarEnum.bar2 : Symbol(BarEnum.bar2, Decl(discriminantPropertyCheck.ts, 127, 13)) +>BarEnum : Symbol(BarEnum, Decl(discriminantPropertyCheck.ts, 124, 44)) +>bar2 : Symbol(BarEnum.bar2, Decl(discriminantPropertyCheck.ts, 127, 13)) + + break; + default: + never(value.type); +>never : Symbol(never, Decl(discriminantPropertyCheck.ts, 120, 26)) +>value.type : Symbol(type, Decl(discriminantPropertyCheck.ts, 132, 17), Decl(discriminantPropertyCheck.ts, 133, 17)) +>value : Symbol(value, Decl(discriminantPropertyCheck.ts, 135, 15)) +>type : Symbol(type, Decl(discriminantPropertyCheck.ts, 132, 17), Decl(discriminantPropertyCheck.ts, 133, 17)) + } + } +} + diff --git a/tests/baselines/reference/discriminantPropertyCheck.types b/tests/baselines/reference/discriminantPropertyCheck.types index c243ef5e798..5a30f575189 100644 --- a/tests/baselines/reference/discriminantPropertyCheck.types +++ b/tests/baselines/reference/discriminantPropertyCheck.types @@ -378,3 +378,73 @@ u.b && u.a && f(u.a, u.b); >u : U >b : string +// Repro from #29496 + +declare function never(value: never): never; +>never : (value: never) => never +>value : never + +const enum BarEnum { +>BarEnum : BarEnum + + bar1 = 1, +>bar1 : BarEnum.bar1 +>1 : 1 + + bar2 = 2, +>bar2 : BarEnum.bar2 +>2 : 2 +} + +type UnionOfBar = TypeBar1 | TypeBar2; +>UnionOfBar : UnionOfBar + +type TypeBar1 = { type: BarEnum.bar1 }; +>TypeBar1 : TypeBar1 +>type : BarEnum.bar1 +>BarEnum : any + +type TypeBar2 = { type: BarEnum.bar2 }; +>TypeBar2 : TypeBar2 +>type : BarEnum.bar2 +>BarEnum : any + +function func3(value: Partial) { +>func3 : (value: Partial | Partial) => void +>value : Partial | Partial + + if (value.type !== undefined) { +>value.type !== undefined : boolean +>value.type : BarEnum | undefined +>value : Partial | Partial +>type : BarEnum | undefined +>undefined : undefined + + switch (value.type) { +>value.type : BarEnum +>value : Partial | Partial +>type : BarEnum + + case BarEnum.bar1: +>BarEnum.bar1 : BarEnum.bar1 +>BarEnum : typeof BarEnum +>bar1 : BarEnum.bar1 + + break; + case BarEnum.bar2: +>BarEnum.bar2 : BarEnum.bar2 +>BarEnum : typeof BarEnum +>bar2 : BarEnum.bar2 + + break; + default: + never(value.type); +>never(value.type) : never +>never : (value: never) => never +>value.type : never +>value : Partial | Partial +>type : never + } + } +} +