@@ -6865,19 +6865,16 @@ namespace ts {
68656865 type.flags & TypeFlags.Enum && type.symbol.flags & SymbolFlags.EnumMember ? true : false;
68666866 }
68676867
6868- function isLiteralUnionType(type: Type): boolean {
6869- return type.flags & TypeFlags.Literal ? true :
6870- type.flags & TypeFlags.Enum ? (type.symbol.flags & SymbolFlags.EnumMember) !== 0 :
6871- type.flags & TypeFlags.Union ? forEach((<UnionType>type).types, isLiteralUnionType) :
6872- false;
6868+ function isUnitUnionType(type: Type): boolean {
6869+ return type.flags & TypeFlags.Union ? forEach((<UnionType>type).types, isUnitType) : isUnitType(type);
68736870 }
68746871
6875- function getBaseTypeOfLiteralType (type: Type): Type {
6872+ function getBaseTypeOfUnitType (type: Type): Type {
68766873 return type.flags & TypeFlags.StringLiteral ? stringType :
68776874 type.flags & TypeFlags.NumberLiteral ? numberType :
68786875 type.flags & TypeFlags.BooleanLiteral ? booleanType :
68796876 type.flags & TypeFlags.Enum && type.symbol.flags & SymbolFlags.EnumMember ? getDeclaredTypeOfSymbol(getParentOfSymbol(type.symbol)) :
6880- type.flags & TypeFlags.Union ? getUnionType(map((<UnionType>type).types, getBaseTypeOfLiteralType )) :
6877+ type.flags & TypeFlags.Union ? getUnionType(map((<UnionType>type).types, getBaseTypeOfUnitType )) :
68816878 type;
68826879 }
68836880
@@ -8123,7 +8120,7 @@ namespace ts {
81238120 }
81248121
81258122 function narrowTypeBySwitchOnDiscriminant(type: Type, switchStatement: SwitchStatement, clauseStart: number, clauseEnd: number) {
8126- if (!isLiteralUnionType (type)) {
8123+ if (!isUnitUnionType (type)) {
81278124 return type;
81288125 }
81298126 const switchTypes = getSwitchClauseTypes(switchStatement);
@@ -11970,7 +11967,7 @@ namespace ts {
1197011967 return false;
1197111968 }
1197211969 const type = checkExpression(node.expression);
11973- if (!isLiteralUnionType (type)) {
11970+ if (!isUnitUnionType (type)) {
1197411971 return false;
1197511972 }
1197611973 const switchTypes = getSwitchClauseTypes(node);
@@ -12690,11 +12687,11 @@ namespace ts {
1269012687 case SyntaxKind.ExclamationEqualsToken:
1269112688 case SyntaxKind.EqualsEqualsEqualsToken:
1269212689 case SyntaxKind.ExclamationEqualsEqualsToken:
12693- const leftIsLiteral = isLiteralUnionType (leftType);
12694- const rightIsLiteral = isLiteralUnionType (rightType);
12695- if (!leftIsLiteral || !rightIsLiteral ) {
12696- leftType = leftIsLiteral ? getBaseTypeOfLiteralType (leftType) : leftType;
12697- rightType = rightIsLiteral ? getBaseTypeOfLiteralType (rightType) : rightType;
12690+ const leftIsUnit = isUnitUnionType (leftType);
12691+ const rightIsUnit = isUnitUnionType (rightType);
12692+ if (!leftIsUnit || !rightIsUnit ) {
12693+ leftType = leftIsUnit ? getBaseTypeOfUnitType (leftType) : leftType;
12694+ rightType = rightIsUnit ? getBaseTypeOfUnitType (rightType) : rightType;
1269812695 }
1269912696 if (!isTypeEqualityComparableTo(leftType, rightType) && !isTypeEqualityComparableTo(rightType, leftType)) {
1270012697 reportOperatorError();
@@ -12836,6 +12833,13 @@ namespace ts {
1283612833 return getUnionType([type1, type2]);
1283712834 }
1283812835
12836+ function isLiteralUnionType(type: Type): boolean {
12837+ return type.flags & TypeFlags.Literal ? true :
12838+ type.flags & TypeFlags.Enum ? (type.symbol.flags & SymbolFlags.EnumMember) !== 0 :
12839+ type.flags & TypeFlags.Union ? forEach((<UnionType>type).types, isLiteralUnionType) :
12840+ false;
12841+ }
12842+
1283912843 function isLiteralTypeContext(node: Expression) {
1284012844 return isLiteralTypeLocation(node) || isLiteralUnionType(getContextualType(node) || unknownType);
1284112845 }
0 commit comments