Skip to content

Commit 396642d

Browse files
committed
Only create Rest<T, K> types when object and/or key type is generic
1 parent 0b194a2 commit 396642d

File tree

1 file changed

+16
-7
lines changed

1 file changed

+16
-7
lines changed

src/compiler/checker.ts

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4600,15 +4600,24 @@ namespace ts {
46004600
if (source.flags & TypeFlags.Union) {
46014601
return mapType(source, t => getRestType(t, properties, symbol));
46024602
}
4603-
const restTypeAlias = getGlobalRestSymbol();
4604-
if (!restTypeAlias) {
4605-
return errorType;
4603+
const omitKeyType = getUnionType(map(properties, getLiteralTypeFromPropertyName));
4604+
if (isGenericObjectType(source) || isGenericIndexType(omitKeyType)) {
4605+
const restTypeAlias = getGlobalRestSymbol();
4606+
return !restTypeAlias ? errorType :
4607+
omitKeyType.flags & TypeFlags.Never ? source :
4608+
getTypeAliasInstantiation(restTypeAlias, [source, omitKeyType]);
46064609
}
4607-
const omitTypes = getUnionType(map(properties, getLiteralTypeFromPropertyName));
4608-
if (omitTypes.flags & TypeFlags.Never) {
4609-
return source;
4610+
const members = createSymbolTable();
4611+
for (const prop of getPropertiesOfType(source)) {
4612+
if (!isTypeAssignableTo(getLiteralTypeFromProperty(prop, TypeFlags.StringOrNumberLiteralOrUnique), omitKeyType)
4613+
&& !(getDeclarationModifierFlagsFromSymbol(prop) & (ModifierFlags.Private | ModifierFlags.Protected))
4614+
&& isSpreadableProperty(prop)) {
4615+
members.set(prop.escapedName, getSpreadSymbol(prop));
4616+
}
46104617
}
4611-
return getTypeAliasInstantiation(restTypeAlias, [source, omitTypes]);
4618+
const stringIndexInfo = getIndexInfoOfType(source, IndexKind.String);
4619+
const numberIndexInfo = getIndexInfoOfType(source, IndexKind.Number);
4620+
return createAnonymousType(symbol, members, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
46124621
}
46134622

46144623
/** Return the inferred type for a binding element */

0 commit comments

Comments
 (0)