Skip to content

Commit 1fc45d3

Browse files
committed
Remove readonly from spread properties
Spreading an object now removes `readonly` from properties in the resulting object.
1 parent 8941e5f commit 1fc45d3

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

src/compiler/checker.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7433,7 +7433,7 @@ namespace ts {
74337433
skippedPrivateMembers.set(rightProp.name, true);
74347434
}
74357435
else if (!isClassMethod(rightProp) && !isSetterWithoutGetter) {
7436-
members.set(rightProp.name, rightProp);
7436+
members.set(rightProp.name, getNonReadonlySymbol(rightProp));
74377437
}
74387438
}
74397439
for (const leftProp of getPropertiesOfType(left)) {
@@ -7449,7 +7449,7 @@ namespace ts {
74497449
const declarations: Declaration[] = concatenate(leftProp.declarations, rightProp.declarations);
74507450
const flags = SymbolFlags.Property | (leftProp.flags & SymbolFlags.Optional);
74517451
const result = createSymbol(flags, leftProp.name);
7452-
result.checkFlags = isReadonlySymbol(leftProp) || isReadonlySymbol(rightProp) ? CheckFlags.Readonly : 0;
7452+
result.checkFlags = 0;
74537453
result.type = getUnionType([getTypeOfSymbol(leftProp), getTypeWithFacts(rightType, TypeFacts.NEUndefined)]);
74547454
result.leftSpread = leftProp;
74557455
result.rightSpread = rightProp;
@@ -7458,12 +7458,25 @@ namespace ts {
74587458
}
74597459
}
74607460
else {
7461-
members.set(leftProp.name, leftProp);
7461+
members.set(leftProp.name, getNonReadonlySymbol(leftProp));
74627462
}
74637463
}
74647464
return createAnonymousType(undefined, members, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
74657465
}
74667466

7467+
function getNonReadonlySymbol(prop: Symbol) {
7468+
if (!(getDeclarationModifierFlagsFromSymbol(prop) & ModifierFlags.Readonly)) {
7469+
return prop;
7470+
}
7471+
const declarations: Declaration[] = prop.declarations;
7472+
const flags = SymbolFlags.Property | (prop.flags & SymbolFlags.Optional);
7473+
const result = createSymbol(flags, prop.name);
7474+
result.checkFlags = 0;
7475+
result.type = getTypeOfSymbol(prop);
7476+
result.declarations = declarations;
7477+
return result;
7478+
}
7479+
74677480
function isClassMethod(prop: Symbol) {
74687481
return prop.flags & SymbolFlags.Method && find(prop.declarations, decl => isClassLike(decl.parent));
74697482
}

0 commit comments

Comments
 (0)