Skip to content

Commit 7e7a26a

Browse files
committed
Spreads w/a single type parameter assignable to that type parameter
1 parent 78420ad commit 7e7a26a

File tree

1 file changed

+32
-15
lines changed

1 file changed

+32
-15
lines changed

src/compiler/checker.ts

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2321,8 +2321,6 @@ namespace ts {
23212321
printFollowingPunctuation = true;
23222322
}
23232323
}
2324-
// TODO: Only print if this is directly on the type -- not on the subtype somewhere.
2325-
// (This is not crucial, though, since the extra info *might* be nice.)
23262324
const resolved = resolveStructuredTypeMembers(type);
23272325
writeIndexSignature(resolved.stringIndexInfo, SyntaxKind.StringKeyword);
23282326
writeIndexSignature(resolved.numberIndexInfo, SyntaxKind.NumberKeyword);
@@ -6656,23 +6654,42 @@ namespace ts {
66566654
}
66576655
}
66586656

6659-
if (source.flags & TypeFlags.Spread && target.flags & TypeFlags.Spread) {
6660-
const sourceParameters = filter((source as SpreadType).types, t => !!(t.flags & TypeFlags.TypeParameter));
6661-
const targetParameters = filter((target as SpreadType).types, t => !!(t.flags & TypeFlags.TypeParameter));
6662-
if (sourceParameters.length !== targetParameters.length) {
6663-
reportRelationError(headMessage, source, target);
6664-
return Ternary.False;
6657+
if (source.flags & TypeFlags.Spread) {
6658+
if (target.flags & TypeFlags.TypeParameter) {
6659+
let hasTypeParameter = false;
6660+
let typeParametersAreEqual = true;
6661+
for (const t of (source as SpreadType).types) {
6662+
if (t.flags & TypeFlags.TypeParameter) {
6663+
hasTypeParameter = true;
6664+
if (t !== target) {
6665+
typeParametersAreEqual = false;
6666+
break;
6667+
}
6668+
}
6669+
}
6670+
if (hasTypeParameter && typeParametersAreEqual) {
6671+
errorInfo = saveErrorInfo;
6672+
return Ternary.True;
6673+
}
66656674
}
6666-
for (let i = 0; i < sourceParameters.length; i++) {
6667-
if (sourceParameters[i].symbol !== targetParameters[i].symbol) {
6675+
else if (target.flags & TypeFlags.Spread) {
6676+
const sourceParameters = filter((source as SpreadType).types, t => !!(t.flags & TypeFlags.TypeParameter));
6677+
const targetParameters = filter((target as SpreadType).types, t => !!(t.flags & TypeFlags.TypeParameter));
6678+
if (sourceParameters.length !== targetParameters.length) {
66686679
reportRelationError(headMessage, source, target);
66696680
return Ternary.False;
66706681
}
6671-
}
6672-
const reportStructuralErrors = reportErrors && errorInfo === saveErrorInfo;
6673-
if (result = objectTypeRelatedTo(source, source, target, reportStructuralErrors)) {
6674-
errorInfo = saveErrorInfo;
6675-
return result;
6682+
for (let i = 0; i < sourceParameters.length; i++) {
6683+
if (sourceParameters[i].symbol !== targetParameters[i].symbol) {
6684+
reportRelationError(headMessage, source, target);
6685+
return Ternary.False;
6686+
}
6687+
}
6688+
const reportStructuralErrors = reportErrors && errorInfo === saveErrorInfo;
6689+
if (result = objectTypeRelatedTo(source, source, target, reportStructuralErrors)) {
6690+
errorInfo = saveErrorInfo;
6691+
return result;
6692+
}
66766693
}
66776694
}
66786695

0 commit comments

Comments
 (0)