From 9c401b4dbbbab2e1f73d018a8b292000dff06277 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Sun, 28 Apr 2019 13:56:11 -0700 Subject: [PATCH 1/5] Remove over-eager check of AccessFlags.Writing in getIndexedAccessType --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 8ee0a4c051996..41a3432b5aca9 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10080,7 +10080,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; From 3050c62251b9a4cba3c005cd0dae6b91bcf39a8f Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Sun, 28 Apr 2019 13:58:58 -0700 Subject: [PATCH 2/5] Add regression test --- .../cases/conformance/types/keyof/keyofAndIndexedAccess2.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/cases/conformance/types/keyof/keyofAndIndexedAccess2.ts b/tests/cases/conformance/types/keyof/keyofAndIndexedAccess2.ts index 356e0a42ae9b4..2794ec66dd4d5 100644 --- a/tests/cases/conformance/types/keyof/keyofAndIndexedAccess2.ts +++ b/tests/cases/conformance/types/keyof/keyofAndIndexedAccess2.ts @@ -127,3 +127,9 @@ function fn} | {elements: Array}>(par function fn2>(param: T, cb: (element: T[number]) => void) { cb(param[0]); } + +// Repro from #31149 + +function fn3>(param: T, cb: (element: T[number]) => void) { + cb(param[0]); // Argument of type 'string' is not assignable to parameter of type 'T[number]'. +} From 6d60f699cac252ede8c0ab13f4b9b9cb213d8752 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Sun, 28 Apr 2019 13:59:05 -0700 Subject: [PATCH 3/5] Accept new baselines --- .../reference/keyofAndIndexedAccess2.errors.txt | 6 ++++++ .../reference/keyofAndIndexedAccess2.js | 10 ++++++++++ .../reference/keyofAndIndexedAccess2.symbols | 17 +++++++++++++++++ .../reference/keyofAndIndexedAccess2.types | 16 ++++++++++++++++ 4 files changed, 49 insertions(+) diff --git a/tests/baselines/reference/keyofAndIndexedAccess2.errors.txt b/tests/baselines/reference/keyofAndIndexedAccess2.errors.txt index 9a937066374ab..0dceb11f57f26 100644 --- a/tests/baselines/reference/keyofAndIndexedAccess2.errors.txt +++ b/tests/baselines/reference/keyofAndIndexedAccess2.errors.txt @@ -204,4 +204,10 @@ tests/cases/conformance/types/keyof/keyofAndIndexedAccess2.ts(108,5): error TS23 function fn2>(param: T, cb: (element: T[number]) => void) { cb(param[0]); } + + // Repro from #31149 + + function fn3>(param: T, cb: (element: T[number]) => void) { + cb(param[0]); // Argument of type 'string' is not assignable to parameter of type 'T[number]'. + } \ No newline at end of file diff --git a/tests/baselines/reference/keyofAndIndexedAccess2.js b/tests/baselines/reference/keyofAndIndexedAccess2.js index 906bcd0eab3de..60409d65a38ff 100644 --- a/tests/baselines/reference/keyofAndIndexedAccess2.js +++ b/tests/baselines/reference/keyofAndIndexedAccess2.js @@ -125,6 +125,12 @@ function fn} | {elements: Array}>(par function fn2>(param: T, cb: (element: T[number]) => void) { cb(param[0]); } + +// Repro from #31149 + +function fn3>(param: T, cb: (element: T[number]) => void) { + cb(param[0]); // Argument of type 'string' is not assignable to parameter of type 'T[number]'. +} //// [keyofAndIndexedAccess2.js] @@ -207,3 +213,7 @@ function fn(param, cb) { function fn2(param, cb) { cb(param[0]); } +// Repro from #31149 +function fn3(param, cb) { + cb(param[0]); // Argument of type 'string' is not assignable to parameter of type 'T[number]'. +} diff --git a/tests/baselines/reference/keyofAndIndexedAccess2.symbols b/tests/baselines/reference/keyofAndIndexedAccess2.symbols index 24e1a8b0674e7..c82129c4da128 100644 --- a/tests/baselines/reference/keyofAndIndexedAccess2.symbols +++ b/tests/baselines/reference/keyofAndIndexedAccess2.symbols @@ -471,3 +471,20 @@ function fn2>(param: T, cb: (element: T[number]) => void >param : Symbol(param, Decl(keyofAndIndexedAccess2.ts, 123, 38)) } +// Repro from #31149 + +function fn3>(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]); // Argument of type 'string' is not assignable to parameter of type 'T[number]'. +>cb : Symbol(cb, Decl(keyofAndIndexedAccess2.ts, 129, 55)) +>param : Symbol(param, Decl(keyofAndIndexedAccess2.ts, 129, 46)) +} + diff --git a/tests/baselines/reference/keyofAndIndexedAccess2.types b/tests/baselines/reference/keyofAndIndexedAccess2.types index 6c0f3dff934d8..91c6d55a6f531 100644 --- a/tests/baselines/reference/keyofAndIndexedAccess2.types +++ b/tests/baselines/reference/keyofAndIndexedAccess2.types @@ -471,3 +471,19 @@ function fn2>(param: T, cb: (element: T[number]) => void >0 : 0 } +// Repro from #31149 + +function fn3>(param: T, cb: (element: T[number]) => void) { +>fn3 : (param: T, cb: (element: T[number]) => void) => void +>param : T +>cb : (element: T[number]) => void +>element : T[number] + + cb(param[0]); // Argument of type 'string' is not assignable to parameter of type 'T[number]'. +>cb(param[0]) : void +>cb : (element: T[number]) => void +>param[0] : string +>param : T +>0 : 0 +} + From bbce336268b3b1be7bfae663dfdff928ab1c0846 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Sun, 28 Apr 2019 14:12:00 -0700 Subject: [PATCH 4/5] Add additional tests --- .../conformance/types/keyof/keyofAndIndexedAccess2.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/cases/conformance/types/keyof/keyofAndIndexedAccess2.ts b/tests/cases/conformance/types/keyof/keyofAndIndexedAccess2.ts index 2794ec66dd4d5..5251a83bb0611 100644 --- a/tests/cases/conformance/types/keyof/keyofAndIndexedAccess2.ts +++ b/tests/cases/conformance/types/keyof/keyofAndIndexedAccess2.ts @@ -131,5 +131,10 @@ function fn2>(param: T, cb: (element: T[number]) => void // Repro from #31149 function fn3>(param: T, cb: (element: T[number]) => void) { - cb(param[0]); // Argument of type 'string' is not assignable to parameter of type 'T[number]'. + cb(param[0]); +} + +function fn4() { + let x: Array[K] = 'abc'; + let y: ReadonlyArray[K] = 'abc'; } From 64174b9b9556862973d3b6f606a5ab1f8c287a5b Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Sun, 28 Apr 2019 14:12:06 -0700 Subject: [PATCH 5/5] Accept new baselines --- .../reference/keyofAndIndexedAccess2.errors.txt | 7 ++++++- .../reference/keyofAndIndexedAccess2.js | 13 +++++++++++-- .../reference/keyofAndIndexedAccess2.symbols | 17 ++++++++++++++++- .../reference/keyofAndIndexedAccess2.types | 14 +++++++++++++- 4 files changed, 46 insertions(+), 5 deletions(-) diff --git a/tests/baselines/reference/keyofAndIndexedAccess2.errors.txt b/tests/baselines/reference/keyofAndIndexedAccess2.errors.txt index 0dceb11f57f26..f4525727476a8 100644 --- a/tests/baselines/reference/keyofAndIndexedAccess2.errors.txt +++ b/tests/baselines/reference/keyofAndIndexedAccess2.errors.txt @@ -208,6 +208,11 @@ tests/cases/conformance/types/keyof/keyofAndIndexedAccess2.ts(108,5): error TS23 // Repro from #31149 function fn3>(param: T, cb: (element: T[number]) => void) { - cb(param[0]); // Argument of type 'string' is not assignable to parameter of type 'T[number]'. + cb(param[0]); + } + + function fn4() { + let x: Array[K] = 'abc'; + let y: ReadonlyArray[K] = 'abc'; } \ No newline at end of file diff --git a/tests/baselines/reference/keyofAndIndexedAccess2.js b/tests/baselines/reference/keyofAndIndexedAccess2.js index 60409d65a38ff..7bf53b9fba491 100644 --- a/tests/baselines/reference/keyofAndIndexedAccess2.js +++ b/tests/baselines/reference/keyofAndIndexedAccess2.js @@ -129,7 +129,12 @@ function fn2>(param: T, cb: (element: T[number]) => void // Repro from #31149 function fn3>(param: T, cb: (element: T[number]) => void) { - cb(param[0]); // Argument of type 'string' is not assignable to parameter of type 'T[number]'. + cb(param[0]); +} + +function fn4() { + let x: Array[K] = 'abc'; + let y: ReadonlyArray[K] = 'abc'; } @@ -215,5 +220,9 @@ function fn2(param, cb) { } // Repro from #31149 function fn3(param, cb) { - cb(param[0]); // Argument of type 'string' is not assignable to parameter of type 'T[number]'. + cb(param[0]); +} +function fn4() { + let x = 'abc'; + let y = 'abc'; } diff --git a/tests/baselines/reference/keyofAndIndexedAccess2.symbols b/tests/baselines/reference/keyofAndIndexedAccess2.symbols index c82129c4da128..2155451ef7497 100644 --- a/tests/baselines/reference/keyofAndIndexedAccess2.symbols +++ b/tests/baselines/reference/keyofAndIndexedAccess2.symbols @@ -483,8 +483,23 @@ function fn3>(param: T, cb: (element: T[number]) >element : Symbol(element, Decl(keyofAndIndexedAccess2.ts, 129, 61)) >T : Symbol(T, Decl(keyofAndIndexedAccess2.ts, 129, 13)) - cb(param[0]); // Argument of type 'string' is not assignable to parameter of type 'T[number]'. + cb(param[0]); >cb : Symbol(cb, Decl(keyofAndIndexedAccess2.ts, 129, 55)) >param : Symbol(param, Decl(keyofAndIndexedAccess2.ts, 129, 46)) } +function fn4() { +>fn4 : Symbol(fn4, Decl(keyofAndIndexedAccess2.ts, 131, 1)) +>K : Symbol(K, Decl(keyofAndIndexedAccess2.ts, 133, 13)) + + let x: Array[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[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)) +} + diff --git a/tests/baselines/reference/keyofAndIndexedAccess2.types b/tests/baselines/reference/keyofAndIndexedAccess2.types index 91c6d55a6f531..af43ed0f4eb27 100644 --- a/tests/baselines/reference/keyofAndIndexedAccess2.types +++ b/tests/baselines/reference/keyofAndIndexedAccess2.types @@ -479,7 +479,7 @@ function fn3>(param: T, cb: (element: T[number]) >cb : (element: T[number]) => void >element : T[number] - cb(param[0]); // Argument of type 'string' is not assignable to parameter of type 'T[number]'. + cb(param[0]); >cb(param[0]) : void >cb : (element: T[number]) => void >param[0] : string @@ -487,3 +487,15 @@ function fn3>(param: T, cb: (element: T[number]) >0 : 0 } +function fn4() { +>fn4 : () => void + + let x: Array[K] = 'abc'; +>x : string[][K] +>'abc' : "abc" + + let y: ReadonlyArray[K] = 'abc'; +>y : readonly string[][K] +>'abc' : "abc" +} +