@@ -1547,8 +1547,8 @@ namespace ts {
1547
1547
return type;
1548
1548
}
1549
1549
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);
1552
1552
type.flags |= TypeFlags.Boolean;
1553
1553
type.intrinsicName = "boolean";
1554
1554
return type;
@@ -1928,17 +1928,24 @@ namespace ts {
1928
1928
return result;
1929
1929
}
1930
1930
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;
1937
1942
}
1938
1943
}
1939
- return result;
1944
+ if (result) {
1945
+ result.push(t);
1946
+ }
1940
1947
}
1941
- return types;
1948
+ return result || types;
1942
1949
}
1943
1950
1944
1951
function visibilityToString(flags: NodeFlags) {
@@ -2239,7 +2246,7 @@ namespace ts {
2239
2246
writePunctuation(writer, SyntaxKind.OpenParenToken);
2240
2247
}
2241
2248
if (type.flags & TypeFlags.Union) {
2242
- writeTypeList(replaceTrueFalseWithBoolean (type.types), SyntaxKind.BarToken);
2249
+ writeTypeList(reduceLiteralTypes (type.types), SyntaxKind.BarToken);
2243
2250
}
2244
2251
else {
2245
2252
writeTypeList(type.types, SyntaxKind.AmpersandToken);
@@ -3784,7 +3791,7 @@ namespace ts {
3784
3791
if (!memberTypes[value]) {
3785
3792
const memberType = memberTypes[value] = <EnumLiteralType>createType(TypeFlags.EnumLiteral);
3786
3793
memberType.symbol = memberSymbol;
3787
- memberType.baseType = enumType;
3794
+ memberType.baseType = <EnumType & UnionType> enumType;
3788
3795
memberType.text = "" + value;
3789
3796
memberTypeList.push(memberType);
3790
3797
}
0 commit comments