Skip to content

Commit ce8e873

Browse files
authored
regard TemplateLiteral as discriminant property (microsoft#44569)
1 parent 6452cfb commit ce8e873

File tree

5 files changed

+130
-1
lines changed

5 files changed

+130
-1
lines changed

src/compiler/checker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -22031,7 +22031,7 @@ namespace ts {
2203122031
if ((prop as TransientSymbol).isDiscriminantProperty === undefined) {
2203222032
(prop as TransientSymbol).isDiscriminantProperty =
2203322033
((prop as TransientSymbol).checkFlags & CheckFlags.Discriminant) === CheckFlags.Discriminant &&
22034-
!maybeTypeOfKind(getTypeOfSymbol(prop), TypeFlags.Instantiable);
22034+
!maybeTypeOfKind(getTypeOfSymbol(prop), TypeFlags.Instantiable & ~TypeFlags.TemplateLiteral);
2203522035
}
2203622036
return !!(prop as TransientSymbol).isDiscriminantProperty;
2203722037
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//// [discriminatedUnionTypes3.ts]
2+
// Repro from #44435
3+
4+
type Correct = {
5+
code: string
6+
property: true
7+
err: undefined
8+
}
9+
type Err = {
10+
err: `${string} is wrong!`
11+
}
12+
type SomeReturnType = Correct | Err;
13+
14+
const example: SomeReturnType = {} as SomeReturnType;
15+
16+
if (example.err === undefined) {
17+
example.property; // true
18+
}
19+
20+
//// [discriminatedUnionTypes3.js]
21+
"use strict";
22+
// Repro from #44435
23+
var example = {};
24+
if (example.err === undefined) {
25+
example.property; // true
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
=== tests/cases/conformance/types/union/discriminatedUnionTypes3.ts ===
2+
// Repro from #44435
3+
4+
type Correct = {
5+
>Correct : Symbol(Correct, Decl(discriminatedUnionTypes3.ts, 0, 0))
6+
7+
code: string
8+
>code : Symbol(code, Decl(discriminatedUnionTypes3.ts, 2, 16))
9+
10+
property: true
11+
>property : Symbol(property, Decl(discriminatedUnionTypes3.ts, 3, 13))
12+
13+
err: undefined
14+
>err : Symbol(err, Decl(discriminatedUnionTypes3.ts, 4, 15))
15+
}
16+
type Err = {
17+
>Err : Symbol(Err, Decl(discriminatedUnionTypes3.ts, 6, 1))
18+
19+
err: `${string} is wrong!`
20+
>err : Symbol(err, Decl(discriminatedUnionTypes3.ts, 7, 12))
21+
}
22+
type SomeReturnType = Correct | Err;
23+
>SomeReturnType : Symbol(SomeReturnType, Decl(discriminatedUnionTypes3.ts, 9, 1))
24+
>Correct : Symbol(Correct, Decl(discriminatedUnionTypes3.ts, 0, 0))
25+
>Err : Symbol(Err, Decl(discriminatedUnionTypes3.ts, 6, 1))
26+
27+
const example: SomeReturnType = {} as SomeReturnType;
28+
>example : Symbol(example, Decl(discriminatedUnionTypes3.ts, 12, 5))
29+
>SomeReturnType : Symbol(SomeReturnType, Decl(discriminatedUnionTypes3.ts, 9, 1))
30+
>SomeReturnType : Symbol(SomeReturnType, Decl(discriminatedUnionTypes3.ts, 9, 1))
31+
32+
if (example.err === undefined) {
33+
>example.err : Symbol(err, Decl(discriminatedUnionTypes3.ts, 4, 15), Decl(discriminatedUnionTypes3.ts, 7, 12))
34+
>example : Symbol(example, Decl(discriminatedUnionTypes3.ts, 12, 5))
35+
>err : Symbol(err, Decl(discriminatedUnionTypes3.ts, 4, 15), Decl(discriminatedUnionTypes3.ts, 7, 12))
36+
>undefined : Symbol(undefined)
37+
38+
example.property; // true
39+
>example.property : Symbol(property, Decl(discriminatedUnionTypes3.ts, 3, 13))
40+
>example : Symbol(example, Decl(discriminatedUnionTypes3.ts, 12, 5))
41+
>property : Symbol(property, Decl(discriminatedUnionTypes3.ts, 3, 13))
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
=== tests/cases/conformance/types/union/discriminatedUnionTypes3.ts ===
2+
// Repro from #44435
3+
4+
type Correct = {
5+
>Correct : Correct
6+
7+
code: string
8+
>code : string
9+
10+
property: true
11+
>property : true
12+
>true : true
13+
14+
err: undefined
15+
>err : undefined
16+
}
17+
type Err = {
18+
>Err : Err
19+
20+
err: `${string} is wrong!`
21+
>err : `${string} is wrong!`
22+
}
23+
type SomeReturnType = Correct | Err;
24+
>SomeReturnType : SomeReturnType
25+
26+
const example: SomeReturnType = {} as SomeReturnType;
27+
>example : SomeReturnType
28+
>{} as SomeReturnType : SomeReturnType
29+
>{} : {}
30+
31+
if (example.err === undefined) {
32+
>example.err === undefined : boolean
33+
>example.err : `${string} is wrong!` | undefined
34+
>example : SomeReturnType
35+
>err : `${string} is wrong!` | undefined
36+
>undefined : undefined
37+
38+
example.property; // true
39+
>example.property : true
40+
>example : Correct
41+
>property : true
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// @strict: true
2+
3+
// Repro from #44435
4+
5+
type Correct = {
6+
code: string
7+
property: true
8+
err: undefined
9+
}
10+
type Err = {
11+
err: `${string} is wrong!`
12+
}
13+
type SomeReturnType = Correct | Err;
14+
15+
const example: SomeReturnType = {} as SomeReturnType;
16+
17+
if (example.err === undefined) {
18+
example.property; // true
19+
}

0 commit comments

Comments
 (0)