regard TemplateLiteral as discriminant property (#44569)

This commit is contained in:
Zzzen 2021-06-24 06:48:39 +08:00 committed by GitHub
parent 6452cfbad0
commit ce8e873bf8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 130 additions and 1 deletions

View file

@ -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;
}

View file

@ -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
}

View file

@ -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))
}

View file

@ -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
}

View file

@ -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
}