@@ -4600,15 +4600,24 @@ namespace ts {
4600
4600
if (source.flags & TypeFlags.Union) {
4601
4601
return mapType(source, t => getRestType(t, properties, symbol));
4602
4602
}
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]);
4606
4609
}
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
+ }
4610
4617
}
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);
4612
4621
}
4613
4622
4614
4623
/** Return the inferred type for a binding element */
0 commit comments