Skip to content

Commit 977b788

Browse files
committed
Enum assignability:loosen numbers+tighten computed
1. All numbers and numeric literals are assignable to all enums and enum literals. 2. Computed enums are no longer assignable to anything except themselves, even if they would otherwise be "semi-structurally" compatible.
1 parent b497cc5 commit 977b788

File tree

1 file changed

+7
-18
lines changed

1 file changed

+7
-18
lines changed

src/compiler/checker.ts

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6211,9 +6211,10 @@ namespace ts {
62116211
if (enumRelation[id] !== undefined) {
62126212
return enumRelation[id];
62136213
}
6214-
if (source.symbol.name !== target.symbol.name || !(source.symbol.flags & SymbolFlags.RegularEnum) || !(target.symbol.flags & SymbolFlags.RegularEnum)) {
6215-
enumRelation[id] = false;
6216-
return false;
6214+
if (source.symbol.name !== target.symbol.name ||
6215+
!(source.symbol.flags & SymbolFlags.RegularEnum) || !(target.symbol.flags & SymbolFlags.RegularEnum) ||
6216+
!(source.flags & TypeFlags.Union) || !(target.flags & TypeFlags.Union)) {
6217+
return (enumRelation[id] = false);
62176218
}
62186219
const targetEnumType = getTypeOfSymbol(target.symbol);
62196220
for (const property of getPropertiesOfType(getTypeOfSymbol(source.symbol))) {
@@ -6224,13 +6225,11 @@ namespace ts {
62246225
errorReporter(Diagnostics.Property_0_is_missing_in_type_1, property.name,
62256226
typeToString(target, /*enclosingDeclaration*/ undefined, TypeFormatFlags.UseFullyQualifiedType));
62266227
}
6227-
enumRelation[id] = false;
6228-
return false;
6228+
return (enumRelation[id] = false);
62296229
}
62306230
}
62316231
}
6232-
enumRelation[id] = true;
6233-
return true;
6232+
return (enumRelation[id] = true);
62346233
}
62356234

62366235
function isSimpleTypeRelatedTo(source: Type, target: Type, relation: Map<RelationComparisonResult>, errorReporter?: ErrorReporter) {
@@ -6245,9 +6244,7 @@ namespace ts {
62456244
if (source.flags & TypeFlags.Null && (!strictNullChecks || target.flags & TypeFlags.Null)) return true;
62466245
if (relation === assignableRelation || relation === comparableRelation) {
62476246
if (source.flags & TypeFlags.Any) return true;
6248-
if (source.flags & TypeFlags.Number && target.flags & TypeFlags.EnumLike) return true;
6249-
if (source.flags & TypeFlags.NumberLiteral && target.flags & TypeFlags.Enum) return true;
6250-
if (source.flags & TypeFlags.NumberLiteral && target.flags & TypeFlags.EnumLiteral && (<LiteralType>source).text === (<LiteralType>target).text) return true;
6247+
if ((source.flags & TypeFlags.Number | source.flags & TypeFlags.NumberLiteral) && target.flags & TypeFlags.EnumLike) return true;
62516248
if (source.flags & TypeFlags.EnumLiteral &&
62526249
target.flags & TypeFlags.EnumLiteral &&
62536250
(<LiteralType>source).text === (<LiteralType>target).text &&
@@ -6434,14 +6431,6 @@ namespace ts {
64346431
if (result = typeRelatedToSomeType(source, <UnionType>target, reportErrors && !(source.flags & TypeFlags.Primitive) && !(target.flags & TypeFlags.Primitive))) {
64356432
return result;
64366433
}
6437-
if (source.flags & TypeFlags.Enum) {
6438-
// 1. look through the target union for a literal whose base type is related to the source
6439-
const lit = find((<UnionType>target).types, t => t.flags & TypeFlags.EnumLiteral && isEnumTypeRelatedTo(<EnumType>source, (<EnumLiteralType>t).baseType));
6440-
// 2. if found, the base type is only assignable to source if all its literals are in the target union.
6441-
if (lit && (result = isRelatedTo((lit as EnumLiteralType).baseType, target, /*reportErrors*/ false))) {
6442-
return result;
6443-
}
6444-
}
64456434
}
64466435
}
64476436

0 commit comments

Comments
 (0)