From ce8e873bf893fc8a593dcc968c09725944278f57 Mon Sep 17 00:00:00 2001 From: Zzzen <843968788@qq.com> Date: Thu, 24 Jun 2021 06:48:39 +0800 Subject: [PATCH] regard TemplateLiteral as discriminant property (#44569) --- src/compiler/checker.ts | 2 +- .../reference/discriminatedUnionTypes3.js | 26 ++++++++++++ .../discriminatedUnionTypes3.symbols | 42 +++++++++++++++++++ .../reference/discriminatedUnionTypes3.types | 42 +++++++++++++++++++ .../types/union/discriminatedUnionTypes3.ts | 19 +++++++++ 5 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/discriminatedUnionTypes3.js create mode 100644 tests/baselines/reference/discriminatedUnionTypes3.symbols create mode 100644 tests/baselines/reference/discriminatedUnionTypes3.types create mode 100644 tests/cases/conformance/types/union/discriminatedUnionTypes3.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 2a25f0daa78..26926b37786 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -22031,7 +22031,7 @@ namespace ts { if ((prop as TransientSymbol).isDiscriminantProperty === undefined) { (prop as TransientSymbol).isDiscriminantProperty = ((prop as TransientSymbol).checkFlags & CheckFlags.Discriminant) === CheckFlags.Discriminant && - !maybeTypeOfKind(getTypeOfSymbol(prop), TypeFlags.Instantiable); + !maybeTypeOfKind(getTypeOfSymbol(prop), TypeFlags.Instantiable & ~TypeFlags.TemplateLiteral); } return !!(prop as TransientSymbol).isDiscriminantProperty; } diff --git a/tests/baselines/reference/discriminatedUnionTypes3.js b/tests/baselines/reference/discriminatedUnionTypes3.js new file mode 100644 index 00000000000..74edcd85ac0 --- /dev/null +++ b/tests/baselines/reference/discriminatedUnionTypes3.js @@ -0,0 +1,26 @@ +//// [discriminatedUnionTypes3.ts] +// Repro from #44435 + +type Correct = { + code: string + property: true + err: undefined +} +type Err = { + err: `${string} is wrong!` +} +type SomeReturnType = Correct | Err; + +const example: SomeReturnType = {} as SomeReturnType; + +if (example.err === undefined) { + example.property; // true +} + +//// [discriminatedUnionTypes3.js] +"use strict"; +// Repro from #44435 +var example = {}; +if (example.err === undefined) { + example.property; // true +} diff --git a/tests/baselines/reference/discriminatedUnionTypes3.symbols b/tests/baselines/reference/discriminatedUnionTypes3.symbols new file mode 100644 index 00000000000..65fdd498770 --- /dev/null +++ b/tests/baselines/reference/discriminatedUnionTypes3.symbols @@ -0,0 +1,42 @@ +=== tests/cases/conformance/types/union/discriminatedUnionTypes3.ts === +// Repro from #44435 + +type Correct = { +>Correct : Symbol(Correct, Decl(discriminatedUnionTypes3.ts, 0, 0)) + + code: string +>code : Symbol(code, Decl(discriminatedUnionTypes3.ts, 2, 16)) + + property: true +>property : Symbol(property, Decl(discriminatedUnionTypes3.ts, 3, 13)) + + err: undefined +>err : Symbol(err, Decl(discriminatedUnionTypes3.ts, 4, 15)) +} +type Err = { +>Err : Symbol(Err, Decl(discriminatedUnionTypes3.ts, 6, 1)) + + err: `${string} is wrong!` +>err : Symbol(err, Decl(discriminatedUnionTypes3.ts, 7, 12)) +} +type SomeReturnType = Correct | Err; +>SomeReturnType : Symbol(SomeReturnType, Decl(discriminatedUnionTypes3.ts, 9, 1)) +>Correct : Symbol(Correct, Decl(discriminatedUnionTypes3.ts, 0, 0)) +>Err : Symbol(Err, Decl(discriminatedUnionTypes3.ts, 6, 1)) + +const example: SomeReturnType = {} as SomeReturnType; +>example : Symbol(example, Decl(discriminatedUnionTypes3.ts, 12, 5)) +>SomeReturnType : Symbol(SomeReturnType, Decl(discriminatedUnionTypes3.ts, 9, 1)) +>SomeReturnType : Symbol(SomeReturnType, Decl(discriminatedUnionTypes3.ts, 9, 1)) + +if (example.err === undefined) { +>example.err : Symbol(err, Decl(discriminatedUnionTypes3.ts, 4, 15), Decl(discriminatedUnionTypes3.ts, 7, 12)) +>example : Symbol(example, Decl(discriminatedUnionTypes3.ts, 12, 5)) +>err : Symbol(err, Decl(discriminatedUnionTypes3.ts, 4, 15), Decl(discriminatedUnionTypes3.ts, 7, 12)) +>undefined : Symbol(undefined) + + example.property; // true +>example.property : Symbol(property, Decl(discriminatedUnionTypes3.ts, 3, 13)) +>example : Symbol(example, Decl(discriminatedUnionTypes3.ts, 12, 5)) +>property : Symbol(property, Decl(discriminatedUnionTypes3.ts, 3, 13)) +} diff --git a/tests/baselines/reference/discriminatedUnionTypes3.types b/tests/baselines/reference/discriminatedUnionTypes3.types new file mode 100644 index 00000000000..8c645a17735 --- /dev/null +++ b/tests/baselines/reference/discriminatedUnionTypes3.types @@ -0,0 +1,42 @@ +=== tests/cases/conformance/types/union/discriminatedUnionTypes3.ts === +// Repro from #44435 + +type Correct = { +>Correct : Correct + + code: string +>code : string + + property: true +>property : true +>true : true + + err: undefined +>err : undefined +} +type Err = { +>Err : Err + + err: `${string} is wrong!` +>err : `${string} is wrong!` +} +type SomeReturnType = Correct | Err; +>SomeReturnType : SomeReturnType + +const example: SomeReturnType = {} as SomeReturnType; +>example : SomeReturnType +>{} as SomeReturnType : SomeReturnType +>{} : {} + +if (example.err === undefined) { +>example.err === undefined : boolean +>example.err : `${string} is wrong!` | undefined +>example : SomeReturnType +>err : `${string} is wrong!` | undefined +>undefined : undefined + + example.property; // true +>example.property : true +>example : Correct +>property : true +} diff --git a/tests/cases/conformance/types/union/discriminatedUnionTypes3.ts b/tests/cases/conformance/types/union/discriminatedUnionTypes3.ts new file mode 100644 index 00000000000..a5e51271bc5 --- /dev/null +++ b/tests/cases/conformance/types/union/discriminatedUnionTypes3.ts @@ -0,0 +1,19 @@ +// @strict: true + +// Repro from #44435 + +type Correct = { + code: string + property: true + err: undefined +} +type Err = { + err: `${string} is wrong!` +} +type SomeReturnType = Correct | Err; + +const example: SomeReturnType = {} as SomeReturnType; + +if (example.err === undefined) { + example.property; // true +} \ No newline at end of file