@@ -8429,34 +8429,36 @@ namespace ts {
8429
8429
}
8430
8430
8431
8431
function isSimpleTypeRelatedTo(source: Type, target: Type, relation: Map<RelationComparisonResult>, errorReporter?: ErrorReporter) {
8432
- if (target.flags & TypeFlags.Never) return false;
8433
- if (target.flags & TypeFlags.Any || source.flags & TypeFlags.Never) return true;
8434
- 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) &&
8432
+ const s = source.flags;
8433
+ const t = target.flags;
8434
+ if (t & TypeFlags.Never) return false;
8435
+ if (t & TypeFlags.Any || s & TypeFlags.Never) return true;
8436
+ if (s & TypeFlags.StringLike && t & TypeFlags.String) return true;
8437
+ if (s & TypeFlags.StringLiteral && s & TypeFlags.EnumLiteral &&
8438
+ t & TypeFlags.StringLiteral && !(t & TypeFlags.EnumLiteral) &&
8437
8439
(<LiteralType>source).value === (<LiteralType>target).value) return true;
8438
- 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) &&
8440
+ if (s & TypeFlags.NumberLike && t & TypeFlags.Number) return true;
8441
+ if (s & TypeFlags.NumberLiteral && s & TypeFlags.EnumLiteral &&
8442
+ t & TypeFlags.NumberLiteral && !(t & TypeFlags.EnumLiteral) &&
8441
8443
(<LiteralType>source).value === (<LiteralType>target).value) return true;
8442
- if (source.flags & TypeFlags.BooleanLike && target.flags & TypeFlags.Boolean) return true;
8443
- if (source.flags & TypeFlags.Enum && target.flags & TypeFlags.Enum && isEnumTypeRelatedTo(source.symbol, target.symbol, errorReporter)) return true;
8444
- if (source.flags & TypeFlags.EnumLiteral && target.flags & TypeFlags.EnumLiteral) {
8445
- if (source.flags & TypeFlags.Union && target.flags & TypeFlags.Union && isEnumTypeRelatedTo(source.symbol, target.symbol, errorReporter)) return true;
8446
- if (source.flags & TypeFlags.Literal && target.flags & TypeFlags.Literal &&
8444
+ if (s & TypeFlags.BooleanLike && t & TypeFlags.Boolean) return true;
8445
+ if (s & TypeFlags.Enum && t & TypeFlags.Enum && isEnumTypeRelatedTo(source.symbol, target.symbol, errorReporter)) return true;
8446
+ if (s & TypeFlags.EnumLiteral && t & TypeFlags.EnumLiteral) {
8447
+ if (s & TypeFlags.Union && t & TypeFlags.Union && isEnumTypeRelatedTo(source.symbol, target.symbol, errorReporter)) return true;
8448
+ if (s & TypeFlags.Literal && t & TypeFlags.Literal &&
8447
8449
(<LiteralType>source).value === (<LiteralType>target).value &&
8448
8450
isEnumTypeRelatedTo(getParentOfSymbol(source.symbol), getParentOfSymbol(target.symbol), errorReporter)) return true;
8449
8451
}
8450
- if (source.flags & TypeFlags.Undefined && (!strictNullChecks || target.flags & (TypeFlags.Undefined | TypeFlags.Void))) return true;
8451
- if (source.flags & TypeFlags.Null && (!strictNullChecks || target.flags & TypeFlags.Null)) return true;
8452
- if (source.flags & TypeFlags.Object && target.flags & TypeFlags.NonPrimitive) return true;
8452
+ if (s & TypeFlags.Undefined && (!strictNullChecks || t & (TypeFlags.Undefined | TypeFlags.Void))) return true;
8453
+ if (s & TypeFlags.Null && (!strictNullChecks || t & TypeFlags.Null)) return true;
8454
+ if (s & TypeFlags.Object && t & TypeFlags.NonPrimitive) return true;
8453
8455
if (relation === assignableRelation || relation === comparableRelation) {
8454
- if (source.flags & TypeFlags.Any) return true;
8456
+ if (s & TypeFlags.Any) return true;
8455
8457
// Type number or any numeric literal type is assignable to any numeric enum type or any
8456
8458
// numeric enum literal type. This rule exists for backwards compatibility reasons because
8457
8459
// 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;
8460
+ if (s & (TypeFlags.Number | TypeFlags.NumberLiteral) && !(s & TypeFlags.EnumLiteral) && (
8461
+ t & TypeFlags.Enum || t & TypeFlags.NumberLiteral && t & TypeFlags.EnumLiteral)) return true;
8460
8462
}
8461
8463
return false;
8462
8464
}
0 commit comments