mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Merge pull request #31150 from Microsoft/fixReadonlyIndexedAccess
Fix readonly indexed access used in indexed access type
This commit is contained in:
@@ -10083,7 +10083,7 @@ namespace ts {
|
||||
error(indexNode, Diagnostics.Type_0_cannot_be_used_as_an_index_type, typeToString(indexType));
|
||||
return indexInfo.type;
|
||||
}
|
||||
if (indexInfo.isReadonly && (accessFlags & AccessFlags.Writing || accessExpression && (isAssignmentTarget(accessExpression) || isDeleteTarget(accessExpression)))) {
|
||||
if (indexInfo.isReadonly && accessExpression && (isAssignmentTarget(accessExpression) || isDeleteTarget(accessExpression))) {
|
||||
if (accessExpression) {
|
||||
error(accessExpression, Diagnostics.Index_signature_in_type_0_only_permits_reading, typeToString(objectType));
|
||||
return indexInfo.type;
|
||||
|
||||
@@ -204,4 +204,15 @@ tests/cases/conformance/types/keyof/keyofAndIndexedAccess2.ts(108,5): error TS23
|
||||
function fn2<T extends Array<string>>(param: T, cb: (element: T[number]) => void) {
|
||||
cb(param[0]);
|
||||
}
|
||||
|
||||
// Repro from #31149
|
||||
|
||||
function fn3<T extends ReadonlyArray<string>>(param: T, cb: (element: T[number]) => void) {
|
||||
cb(param[0]);
|
||||
}
|
||||
|
||||
function fn4<K extends number>() {
|
||||
let x: Array<string>[K] = 'abc';
|
||||
let y: ReadonlyArray<string>[K] = 'abc';
|
||||
}
|
||||
|
||||
@@ -125,6 +125,17 @@ function fn<T extends {elements: Array<string>} | {elements: Array<number>}>(par
|
||||
function fn2<T extends Array<string>>(param: T, cb: (element: T[number]) => void) {
|
||||
cb(param[0]);
|
||||
}
|
||||
|
||||
// Repro from #31149
|
||||
|
||||
function fn3<T extends ReadonlyArray<string>>(param: T, cb: (element: T[number]) => void) {
|
||||
cb(param[0]);
|
||||
}
|
||||
|
||||
function fn4<K extends number>() {
|
||||
let x: Array<string>[K] = 'abc';
|
||||
let y: ReadonlyArray<string>[K] = 'abc';
|
||||
}
|
||||
|
||||
|
||||
//// [keyofAndIndexedAccess2.js]
|
||||
@@ -207,3 +218,11 @@ function fn(param, cb) {
|
||||
function fn2(param, cb) {
|
||||
cb(param[0]);
|
||||
}
|
||||
// Repro from #31149
|
||||
function fn3(param, cb) {
|
||||
cb(param[0]);
|
||||
}
|
||||
function fn4() {
|
||||
let x = 'abc';
|
||||
let y = 'abc';
|
||||
}
|
||||
|
||||
@@ -471,3 +471,35 @@ function fn2<T extends Array<string>>(param: T, cb: (element: T[number]) => void
|
||||
>param : Symbol(param, Decl(keyofAndIndexedAccess2.ts, 123, 38))
|
||||
}
|
||||
|
||||
// Repro from #31149
|
||||
|
||||
function fn3<T extends ReadonlyArray<string>>(param: T, cb: (element: T[number]) => void) {
|
||||
>fn3 : Symbol(fn3, Decl(keyofAndIndexedAccess2.ts, 125, 1))
|
||||
>T : Symbol(T, Decl(keyofAndIndexedAccess2.ts, 129, 13))
|
||||
>ReadonlyArray : Symbol(ReadonlyArray, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2016.array.include.d.ts, --, --), Decl(lib.es2019.array.d.ts, --, --))
|
||||
>param : Symbol(param, Decl(keyofAndIndexedAccess2.ts, 129, 46))
|
||||
>T : Symbol(T, Decl(keyofAndIndexedAccess2.ts, 129, 13))
|
||||
>cb : Symbol(cb, Decl(keyofAndIndexedAccess2.ts, 129, 55))
|
||||
>element : Symbol(element, Decl(keyofAndIndexedAccess2.ts, 129, 61))
|
||||
>T : Symbol(T, Decl(keyofAndIndexedAccess2.ts, 129, 13))
|
||||
|
||||
cb(param[0]);
|
||||
>cb : Symbol(cb, Decl(keyofAndIndexedAccess2.ts, 129, 55))
|
||||
>param : Symbol(param, Decl(keyofAndIndexedAccess2.ts, 129, 46))
|
||||
}
|
||||
|
||||
function fn4<K extends number>() {
|
||||
>fn4 : Symbol(fn4, Decl(keyofAndIndexedAccess2.ts, 131, 1))
|
||||
>K : Symbol(K, Decl(keyofAndIndexedAccess2.ts, 133, 13))
|
||||
|
||||
let x: Array<string>[K] = 'abc';
|
||||
>x : Symbol(x, Decl(keyofAndIndexedAccess2.ts, 134, 7))
|
||||
>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --) ... and 2 more)
|
||||
>K : Symbol(K, Decl(keyofAndIndexedAccess2.ts, 133, 13))
|
||||
|
||||
let y: ReadonlyArray<string>[K] = 'abc';
|
||||
>y : Symbol(y, Decl(keyofAndIndexedAccess2.ts, 135, 7))
|
||||
>ReadonlyArray : Symbol(ReadonlyArray, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2016.array.include.d.ts, --, --), Decl(lib.es2019.array.d.ts, --, --))
|
||||
>K : Symbol(K, Decl(keyofAndIndexedAccess2.ts, 133, 13))
|
||||
}
|
||||
|
||||
|
||||
@@ -471,3 +471,31 @@ function fn2<T extends Array<string>>(param: T, cb: (element: T[number]) => void
|
||||
>0 : 0
|
||||
}
|
||||
|
||||
// Repro from #31149
|
||||
|
||||
function fn3<T extends ReadonlyArray<string>>(param: T, cb: (element: T[number]) => void) {
|
||||
>fn3 : <T extends readonly string[]>(param: T, cb: (element: T[number]) => void) => void
|
||||
>param : T
|
||||
>cb : (element: T[number]) => void
|
||||
>element : T[number]
|
||||
|
||||
cb(param[0]);
|
||||
>cb(param[0]) : void
|
||||
>cb : (element: T[number]) => void
|
||||
>param[0] : string
|
||||
>param : T
|
||||
>0 : 0
|
||||
}
|
||||
|
||||
function fn4<K extends number>() {
|
||||
>fn4 : <K extends number>() => void
|
||||
|
||||
let x: Array<string>[K] = 'abc';
|
||||
>x : string[][K]
|
||||
>'abc' : "abc"
|
||||
|
||||
let y: ReadonlyArray<string>[K] = 'abc';
|
||||
>y : readonly string[][K]
|
||||
>'abc' : "abc"
|
||||
}
|
||||
|
||||
|
||||
@@ -127,3 +127,14 @@ function fn<T extends {elements: Array<string>} | {elements: Array<number>}>(par
|
||||
function fn2<T extends Array<string>>(param: T, cb: (element: T[number]) => void) {
|
||||
cb(param[0]);
|
||||
}
|
||||
|
||||
// Repro from #31149
|
||||
|
||||
function fn3<T extends ReadonlyArray<string>>(param: T, cb: (element: T[number]) => void) {
|
||||
cb(param[0]);
|
||||
}
|
||||
|
||||
function fn4<K extends number>() {
|
||||
let x: Array<string>[K] = 'abc';
|
||||
let y: ReadonlyArray<string>[K] = 'abc';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user