Skip to content

Commit f7753af

Browse files
committed
Reduce unions of enum literal types when displaying types
1 parent 9a23b11 commit f7753af

File tree

2 files changed

+20
-13
lines changed

2 files changed

+20
-13
lines changed

src/compiler/checker.ts

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1547,8 +1547,8 @@ namespace ts {
15471547
return type;
15481548
}
15491549

1550-
function createBooleanType(trueFalseTypes: Type[]): IntrinsicType {
1551-
const type = <IntrinsicType>getUnionType(trueFalseTypes, /*noSubtypeReduction*/ true);
1550+
function createBooleanType(trueFalseTypes: Type[]): IntrinsicType & UnionType {
1551+
const type = <IntrinsicType & UnionType>getUnionType(trueFalseTypes, /*noSubtypeReduction*/ true);
15521552
type.flags |= TypeFlags.Boolean;
15531553
type.intrinsicName = "boolean";
15541554
return type;
@@ -1928,17 +1928,24 @@ namespace ts {
19281928
return result;
19291929
}
19301930

1931-
function replaceTrueFalseWithBoolean(types: Type[]): Type[] {
1932-
if (contains(types, trueType) && contains(types, falseType)) {
1933-
const result: Type[] = [];
1934-
for (const t of types) {
1935-
if (t !== falseType) {
1936-
result.push(t === trueType ? booleanType : t);
1931+
function reduceLiteralTypes(types: Type[]): Type[] {
1932+
let result: Type[];
1933+
for (let i = 0; i < types.length; i++) {
1934+
const t = types[i];
1935+
if (t.flags & (TypeFlags.BooleanLiteral | TypeFlags.EnumLiteral)) {
1936+
const baseType = t.flags & TypeFlags.BooleanLiteral ? booleanType : (<EnumLiteralType>t).baseType;
1937+
const count = baseType.types.length;
1938+
if (i + count <= types.length && types[i + count - 1] === baseType.types[count - 1]) {
1939+
(result || (result = types.slice(0, i))).push(baseType);
1940+
i += count - 1;
1941+
continue;
19371942
}
19381943
}
1939-
return result;
1944+
if (result) {
1945+
result.push(t);
1946+
}
19401947
}
1941-
return types;
1948+
return result || types;
19421949
}
19431950

19441951
function visibilityToString(flags: NodeFlags) {
@@ -2239,7 +2246,7 @@ namespace ts {
22392246
writePunctuation(writer, SyntaxKind.OpenParenToken);
22402247
}
22412248
if (type.flags & TypeFlags.Union) {
2242-
writeTypeList(replaceTrueFalseWithBoolean(type.types), SyntaxKind.BarToken);
2249+
writeTypeList(reduceLiteralTypes(type.types), SyntaxKind.BarToken);
22432250
}
22442251
else {
22452252
writeTypeList(type.types, SyntaxKind.AmpersandToken);
@@ -3784,7 +3791,7 @@ namespace ts {
37843791
if (!memberTypes[value]) {
37853792
const memberType = memberTypes[value] = <EnumLiteralType>createType(TypeFlags.EnumLiteral);
37863793
memberType.symbol = memberSymbol;
3787-
memberType.baseType = enumType;
3794+
memberType.baseType = <EnumType & UnionType>enumType;
37883795
memberType.text = "" + value;
37893796
memberTypeList.push(memberType);
37903797
}

src/compiler/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2308,7 +2308,7 @@ namespace ts {
23082308

23092309
// Enum types (TypeFlags.EnumLiteral)
23102310
export interface EnumLiteralType extends LiteralType {
2311-
baseType: EnumType;
2311+
baseType: EnumType & UnionType;
23122312
}
23132313

23142314
// Object types (TypeFlags.ObjectType)

0 commit comments

Comments
 (0)