Merge pull request #19770 from Microsoft/remove-readonly-from-spread-index-sigs
Remove readonly from index signatures of a spread
This commit is contained in:
commit
868d36d51d
|
@ -8000,11 +8000,16 @@ namespace ts {
|
|||
}
|
||||
}
|
||||
|
||||
const spread = createAnonymousType(undefined, members, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
|
||||
const spread = createAnonymousType(
|
||||
symbol,
|
||||
members,
|
||||
emptyArray,
|
||||
emptyArray,
|
||||
getNonReadonlyIndexSignature(stringIndexInfo),
|
||||
getNonReadonlyIndexSignature(numberIndexInfo));
|
||||
spread.flags |= propagatedFlags;
|
||||
spread.flags |= TypeFlags.FreshLiteral | TypeFlags.ContainsObjectLiteral;
|
||||
(spread as ObjectType).objectFlags |= (ObjectFlags.ObjectLiteral | ObjectFlags.ContainsSpread);
|
||||
spread.symbol = symbol;
|
||||
return spread;
|
||||
}
|
||||
|
||||
|
@ -8020,6 +8025,13 @@ namespace ts {
|
|||
return result;
|
||||
}
|
||||
|
||||
function getNonReadonlyIndexSignature(index: IndexInfo) {
|
||||
if (index && index.isReadonly) {
|
||||
return createIndexInfo(index.type, /*isReadonly*/ false, index.declaration);
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
function isClassMethod(prop: Symbol) {
|
||||
return prop.flags & SymbolFlags.Method && find(prop.declarations, decl => isClassLike(decl.parent));
|
||||
}
|
||||
|
|
|
@ -16,4 +16,8 @@ tests/cases/conformance/types/spread/objectSpreadIndexSignature.ts(6,1): error T
|
|||
|
||||
declare const b: boolean;
|
||||
indexed3 = { ...b ? indexed3 : undefined };
|
||||
|
||||
declare var roindex: { readonly [x:string]: number };
|
||||
var writable = { ...roindex };
|
||||
writable.a = 0; // should be ok.
|
||||
|
|
@ -11,6 +11,10 @@ ii[1001];
|
|||
|
||||
declare const b: boolean;
|
||||
indexed3 = { ...b ? indexed3 : undefined };
|
||||
|
||||
declare var roindex: { readonly [x:string]: number };
|
||||
var writable = { ...roindex };
|
||||
writable.a = 0; // should be ok.
|
||||
|
||||
|
||||
//// [objectSpreadIndexSignature.js]
|
||||
|
@ -30,3 +34,5 @@ var ii = __assign({}, indexed1, indexed2);
|
|||
// both have indexer, so i[1001]: number | boolean
|
||||
ii[1001];
|
||||
indexed3 = __assign({}, b ? indexed3 : undefined);
|
||||
var writable = __assign({}, roindex);
|
||||
writable.a = 0; // should be ok.
|
||||
|
|
|
@ -40,3 +40,14 @@ indexed3 = { ...b ? indexed3 : undefined };
|
|||
>indexed3 : Symbol(indexed3, Decl(objectSpreadIndexSignature.ts, 2, 11))
|
||||
>undefined : Symbol(undefined)
|
||||
|
||||
declare var roindex: { readonly [x:string]: number };
|
||||
>roindex : Symbol(roindex, Decl(objectSpreadIndexSignature.ts, 13, 11))
|
||||
>x : Symbol(x, Decl(objectSpreadIndexSignature.ts, 13, 33))
|
||||
|
||||
var writable = { ...roindex };
|
||||
>writable : Symbol(writable, Decl(objectSpreadIndexSignature.ts, 14, 3))
|
||||
>roindex : Symbol(roindex, Decl(objectSpreadIndexSignature.ts, 13, 11))
|
||||
|
||||
writable.a = 0; // should be ok.
|
||||
>writable : Symbol(writable, Decl(objectSpreadIndexSignature.ts, 14, 3))
|
||||
|
||||
|
|
|
@ -50,3 +50,19 @@ indexed3 = { ...b ? indexed3 : undefined };
|
|||
>indexed3 : { [n: string]: number; }
|
||||
>undefined : undefined
|
||||
|
||||
declare var roindex: { readonly [x:string]: number };
|
||||
>roindex : { readonly [x: string]: number; }
|
||||
>x : string
|
||||
|
||||
var writable = { ...roindex };
|
||||
>writable : { [x: string]: number; }
|
||||
>{ ...roindex } : { [x: string]: number; }
|
||||
>roindex : { readonly [x: string]: number; }
|
||||
|
||||
writable.a = 0; // should be ok.
|
||||
>writable.a = 0 : 0
|
||||
>writable.a : number
|
||||
>writable : { [x: string]: number; }
|
||||
>a : number
|
||||
>0 : 0
|
||||
|
||||
|
|
|
@ -11,3 +11,7 @@ ii[1001];
|
|||
|
||||
declare const b: boolean;
|
||||
indexed3 = { ...b ? indexed3 : undefined };
|
||||
|
||||
declare var roindex: { readonly [x:string]: number };
|
||||
var writable = { ...roindex };
|
||||
writable.a = 0; // should be ok.
|
||||
|
|
Loading…
Reference in a new issue