Skip to content

Commit 106214a

Browse files
committed
Enum literal type is assignable to regular literal type with same value
1 parent 72e77a8 commit 106214a

File tree

1 file changed

+11
-1
lines changed

1 file changed

+11
-1
lines changed

src/compiler/checker.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8432,7 +8432,13 @@ namespace ts {
84328432
if (target.flags & TypeFlags.Never) return false;
84338433
if (target.flags & TypeFlags.Any || source.flags & TypeFlags.Never) return true;
84348434
if (source.flags & TypeFlags.StringLike && target.flags & TypeFlags.String) return true;
8435+
if (source.flags & TypeFlags.StringLiteral && source.flags & TypeFlags.EnumLiteral &&
8436+
target.flags & TypeFlags.StringLiteral && !(target.flags & TypeFlags.EnumLiteral) &&
8437+
(<LiteralType>source).value === (<LiteralType>target).value) return true;
84358438
if (source.flags & TypeFlags.NumberLike && target.flags & TypeFlags.Number) return true;
8439+
if (source.flags & TypeFlags.NumberLiteral && source.flags & TypeFlags.EnumLiteral &&
8440+
target.flags & TypeFlags.NumberLiteral && !(target.flags & TypeFlags.EnumLiteral) &&
8441+
(<LiteralType>source).value === (<LiteralType>target).value) return true;
84368442
if (source.flags & TypeFlags.BooleanLike && target.flags & TypeFlags.Boolean) return true;
84378443
if (source.flags & TypeFlags.Enum && target.flags & TypeFlags.Enum && isEnumTypeRelatedTo(source.symbol, target.symbol, errorReporter)) return true;
84388444
if (source.flags & TypeFlags.EnumLiteral && target.flags & TypeFlags.EnumLiteral) {
@@ -8446,7 +8452,11 @@ namespace ts {
84468452
if (source.flags & TypeFlags.Object && target.flags & TypeFlags.NonPrimitive) return true;
84478453
if (relation === assignableRelation || relation === comparableRelation) {
84488454
if (source.flags & TypeFlags.Any) return true;
8449-
if (source.flags & (TypeFlags.Number | TypeFlags.NumberLiteral) && !(source.flags & TypeFlags.EnumLiteral) && target.flags & TypeFlags.EnumLike) return true;
8455+
// Type number or any numeric literal type is assignable to any numeric enum type or any
8456+
// numeric enum literal type. This rule exists for backwards compatibility reasons because
8457+
// bit-flag enum types sometimes look like literal enum types with numeric literal values.
8458+
if (source.flags & (TypeFlags.Number | TypeFlags.NumberLiteral) && !(source.flags & TypeFlags.EnumLiteral) && (
8459+
target.flags & TypeFlags.Enum || target.flags & TypeFlags.NumberLiteral && target.flags & TypeFlags.EnumLiteral)) return true;
84508460
}
84518461
return false;
84528462
}

0 commit comments

Comments
 (0)