@@ -6241,7 +6241,7 @@ namespace ts {
6241
6241
* this function should be called in a left folding style, with left = previous result of getSpreadType
6242
6242
* and right = the new element to be spread.
6243
6243
*/
6244
- function getSpreadType(left: Type, right: Type, isFromObjectLiteral: boolean ): Type {
6244
+ function getSpreadType(left: Type, right: Type): Type {
6245
6245
if (left.flags & TypeFlags.Any || right.flags & TypeFlags.Any) {
6246
6246
return anyType;
6247
6247
}
@@ -6254,10 +6254,10 @@ namespace ts {
6254
6254
return left;
6255
6255
}
6256
6256
if (left.flags & TypeFlags.Union) {
6257
- return mapType(left, t => getSpreadType(t, right, isFromObjectLiteral ));
6257
+ return mapType(left, t => getSpreadType(t, right));
6258
6258
}
6259
6259
if (right.flags & TypeFlags.Union) {
6260
- return mapType(right, t => getSpreadType(left, t, isFromObjectLiteral ));
6260
+ return mapType(right, t => getSpreadType(left, t));
6261
6261
}
6262
6262
6263
6263
const members = createMap<Symbol>();
@@ -6276,18 +6276,18 @@ namespace ts {
6276
6276
6277
6277
for (const rightProp of getPropertiesOfType(right)) {
6278
6278
// we approximate own properties as non-methods plus methods that are inside the object literal
6279
- const isOwnProperty = !(rightProp.flags & SymbolFlags.Method) || isFromObjectLiteral;
6280
6279
const isSetterWithoutGetter = rightProp.flags & SymbolFlags.SetAccessor && !(rightProp.flags & SymbolFlags.GetAccessor);
6281
6280
if (getDeclarationModifierFlagsFromSymbol(rightProp) & (ModifierFlags.Private | ModifierFlags.Protected)) {
6282
6281
skippedPrivateMembers[rightProp.name] = true;
6283
6282
}
6284
- else if (isOwnProperty && !isSetterWithoutGetter) {
6283
+ else if (!isClassMethod(rightProp) && !isSetterWithoutGetter) {
6285
6284
members[rightProp.name] = rightProp;
6286
6285
}
6287
6286
}
6288
6287
for (const leftProp of getPropertiesOfType(left)) {
6289
6288
if (leftProp.flags & SymbolFlags.SetAccessor && !(leftProp.flags & SymbolFlags.GetAccessor)
6290
- || leftProp.name in skippedPrivateMembers) {
6289
+ || leftProp.name in skippedPrivateMembers
6290
+ || isClassMethod(leftProp)) {
6291
6291
continue;
6292
6292
}
6293
6293
if (leftProp.name in members) {
@@ -6312,6 +6312,10 @@ namespace ts {
6312
6312
return createAnonymousType(undefined, members, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
6313
6313
}
6314
6314
6315
+ function isClassMethod(prop: Symbol) {
6316
+ return prop.flags & SymbolFlags.Method && find(prop.declarations, decl => isClassLike(decl.parent));
6317
+ }
6318
+
6315
6319
function createLiteralType(flags: TypeFlags, text: string) {
6316
6320
const type = <LiteralType>createType(flags);
6317
6321
type.text = text;
@@ -11658,7 +11662,7 @@ namespace ts {
11658
11662
checkExternalEmitHelpers(memberDecl, ExternalEmitHelpers.Assign);
11659
11663
}
11660
11664
if (propertiesArray.length > 0) {
11661
- spread = getSpreadType(spread, createObjectLiteralType(), /*isFromObjectLiteral*/ true );
11665
+ spread = getSpreadType(spread, createObjectLiteralType());
11662
11666
propertiesArray = [];
11663
11667
propertiesTable = createMap<Symbol>();
11664
11668
hasComputedStringProperty = false;
@@ -11670,7 +11674,7 @@ namespace ts {
11670
11674
error(memberDecl, Diagnostics.Spread_types_may_only_be_created_from_object_types);
11671
11675
return unknownType;
11672
11676
}
11673
- spread = getSpreadType(spread, type, /*isFromObjectLiteral*/ false );
11677
+ spread = getSpreadType(spread, type);
11674
11678
offset = i + 1;
11675
11679
continue;
11676
11680
}
@@ -11715,7 +11719,7 @@ namespace ts {
11715
11719
11716
11720
if (spread !== emptyObjectType) {
11717
11721
if (propertiesArray.length > 0) {
11718
- spread = getSpreadType(spread, createObjectLiteralType(), /*isFromObjectLiteral*/ true );
11722
+ spread = getSpreadType(spread, createObjectLiteralType());
11719
11723
}
11720
11724
if (spread.flags & TypeFlags.Object) {
11721
11725
// only set the symbol and flags if this is a (fresh) object type
0 commit comments