@@ -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 }
0 commit comments