Skip to content

Commit d7cefaf

Browse files
committed
Prefer using enum literal's own base type rather than enum's base type in comparison
1 parent 11ff2a5 commit d7cefaf

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

src/compiler/checker.ts

+14-2
Original file line numberDiff line numberDiff line change
@@ -22978,6 +22978,18 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2297822978
type;
2297922979
}
2298022980

22981+
// This is the same as getBaseTypeOfLiteralType, but checks EnumLiteral last so we get
22982+
// a specific literal's base type rather than the enum's base type.
22983+
function getBaseTypeOfLiteralTypeForComparison(type: Type): Type {
22984+
return type.flags & (TypeFlags.StringLiteral | TypeFlags.TemplateLiteral | TypeFlags.StringMapping) ? stringType :
22985+
type.flags & TypeFlags.NumberLiteral ? numberType :
22986+
type.flags & TypeFlags.BigIntLiteral ? bigintType :
22987+
type.flags & TypeFlags.BooleanLiteral ? booleanType :
22988+
type.flags & TypeFlags.EnumLiteral ? getBaseTypeOfEnumLiteralType(type as LiteralType) :
22989+
type.flags & TypeFlags.Union ? getBaseTypeOfLiteralTypeUnion(type as UnionType) :
22990+
type;
22991+
}
22992+
2298122993
function getBaseTypeOfLiteralTypeUnion(type: UnionType) {
2298222994
const key = `B${getTypeId(type)}`;
2298322995
return getCachedType(key) ?? setCachedType(key, mapType(type, getBaseTypeOfLiteralType));
@@ -36423,8 +36435,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3642336435
case SyntaxKind.LessThanEqualsToken:
3642436436
case SyntaxKind.GreaterThanEqualsToken:
3642536437
if (checkForDisallowedESSymbolOperand(operator)) {
36426-
leftType = getBaseTypeOfLiteralType(checkNonNullType(leftType, left));
36427-
rightType = getBaseTypeOfLiteralType(checkNonNullType(rightType, right));
36438+
leftType = getBaseTypeOfLiteralTypeForComparison(checkNonNullType(leftType, left));
36439+
rightType = getBaseTypeOfLiteralTypeForComparison(checkNonNullType(rightType, right));
3642836440
reportOperatorErrorUnless((left, right) => {
3642936441
if (isTypeAny(left) || isTypeAny(right)) {
3643036442
return true;

0 commit comments

Comments
 (0)