@@ -7846,7 +7846,7 @@ namespace ts {
7846
7846
* this function should be called in a left folding style, with left = previous result of getSpreadType
7847
7847
* and right = the new element to be spread.
7848
7848
*/
7849
- function getSpreadType(left: Type, right: Type): Type {
7849
+ function getSpreadType(left: Type, right: Type, symbol: Symbol, propagatedFlags: TypeFlags ): Type {
7850
7850
if (left.flags & TypeFlags.Any || right.flags & TypeFlags.Any) {
7851
7851
return anyType;
7852
7852
}
@@ -7857,10 +7857,10 @@ namespace ts {
7857
7857
return left;
7858
7858
}
7859
7859
if (left.flags & TypeFlags.Union) {
7860
- return mapType(left, t => getSpreadType(t, right));
7860
+ return mapType(left, t => getSpreadType(t, right, symbol, propagatedFlags ));
7861
7861
}
7862
7862
if (right.flags & TypeFlags.Union) {
7863
- return mapType(right, t => getSpreadType(left, t));
7863
+ return mapType(right, t => getSpreadType(left, t, symbol, propagatedFlags ));
7864
7864
}
7865
7865
if (right.flags & TypeFlags.NonPrimitive) {
7866
7866
return nonPrimitiveType;
@@ -7918,7 +7918,13 @@ namespace ts {
7918
7918
members.set(leftProp.escapedName, getNonReadonlySymbol(leftProp));
7919
7919
}
7920
7920
}
7921
- return createAnonymousType(undefined, members, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
7921
+
7922
+ const spread = createAnonymousType(undefined, members, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
7923
+ spread.flags |= propagatedFlags;
7924
+ spread.flags |= TypeFlags.FreshLiteral;
7925
+ (spread as ObjectType).objectFlags |= ObjectFlags.ObjectLiteral;
7926
+ spread.symbol = symbol;
7927
+ return spread;
7922
7928
}
7923
7929
7924
7930
function getNonReadonlySymbol(prop: Symbol) {
@@ -13858,7 +13864,7 @@ namespace ts {
13858
13864
checkExternalEmitHelpers(memberDecl, ExternalEmitHelpers.Assign);
13859
13865
}
13860
13866
if (propertiesArray.length > 0) {
13861
- spread = getSpreadType(spread, createObjectLiteralType());
13867
+ spread = getSpreadType(spread, createObjectLiteralType(), node.symbol, propagatedFlags );
13862
13868
propertiesArray = [];
13863
13869
propertiesTable = createSymbolTable();
13864
13870
hasComputedStringProperty = false;
@@ -13870,7 +13876,7 @@ namespace ts {
13870
13876
error(memberDecl, Diagnostics.Spread_types_may_only_be_created_from_object_types);
13871
13877
return unknownType;
13872
13878
}
13873
- spread = getSpreadType(spread, type);
13879
+ spread = getSpreadType(spread, type, node.symbol, propagatedFlags );
13874
13880
offset = i + 1;
13875
13881
continue;
13876
13882
}
@@ -13915,17 +13921,8 @@ namespace ts {
13915
13921
13916
13922
if (spread !== emptyObjectType) {
13917
13923
if (propertiesArray.length > 0) {
13918
- spread = getSpreadType(spread, createObjectLiteralType());
13924
+ spread = getSpreadType(spread, createObjectLiteralType(), node.symbol, propagatedFlags );
13919
13925
}
13920
- // only set the symbol and flags if this is a (fresh) object type
13921
- forEachType(spread, t => {
13922
- if (t.flags & TypeFlags.Object) {
13923
- t.flags |= propagatedFlags;
13924
- t.flags |= TypeFlags.FreshLiteral;
13925
- (t as ObjectType).objectFlags |= ObjectFlags.ObjectLiteral;
13926
- t.symbol = node.symbol;
13927
- }
13928
- });
13929
13926
return spread;
13930
13927
}
13931
13928
@@ -14045,7 +14042,7 @@ namespace ts {
14045
14042
else {
14046
14043
Debug.assert(attributeDecl.kind === SyntaxKind.JsxSpreadAttribute);
14047
14044
if (attributesArray.length > 0) {
14048
- spread = getSpreadType(spread, createJsxAttributesType(attributes.symbol, attributesTable));
14045
+ spread = getSpreadType(spread, createJsxAttributesType(attributes.symbol, attributesTable), openingLikeElement.symbol, /*propagatedFlags*/ 0 );
14049
14046
attributesArray = [];
14050
14047
attributesTable = createSymbolTable();
14051
14048
}
@@ -14054,7 +14051,7 @@ namespace ts {
14054
14051
hasSpreadAnyType = true;
14055
14052
}
14056
14053
if (isValidSpreadType(exprType)) {
14057
- spread = getSpreadType(spread, exprType);
14054
+ spread = getSpreadType(spread, exprType, openingLikeElement.symbol, /*propagatedFlags*/ 0 );
14058
14055
}
14059
14056
else {
14060
14057
typeToIntersect = typeToIntersect ? getIntersectionType([typeToIntersect, exprType]) : exprType;
@@ -14065,7 +14062,7 @@ namespace ts {
14065
14062
if (!hasSpreadAnyType) {
14066
14063
if (spread !== emptyObjectType) {
14067
14064
if (attributesArray.length > 0) {
14068
- spread = getSpreadType(spread, createJsxAttributesType(attributes.symbol, attributesTable));
14065
+ spread = getSpreadType(spread, createJsxAttributesType(attributes.symbol, attributesTable), openingLikeElement.symbol, /*propagatedFlags*/ 0 );
14069
14066
}
14070
14067
attributesArray = getPropertiesOfType(spread);
14071
14068
}
0 commit comments