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:
Nathan Shively-Sanders 2017-11-06 10:20:57 -08:00 committed by GitHub
commit 868d36d51d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 55 additions and 2 deletions

View file

@ -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));
}

View file

@ -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.

View file

@ -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.

View file

@ -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))

View file

@ -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

View file

@ -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.