From 52372c36f113a7099ae8b03cb91b49647883d6e0 Mon Sep 17 00:00:00 2001 From: Alexander T Date: Thu, 9 Jul 2020 20:24:21 +0300 Subject: [PATCH] fix(39524): convert access property suggestion to string --- src/compiler/utilities.ts | 2 +- ...noImplicitAnyStringIndexerOnObject.errors.txt | 11 ++++++++++- .../noImplicitAnyStringIndexerOnObject.js | 7 +++++++ .../noImplicitAnyStringIndexerOnObject.symbols | 16 ++++++++++++++++ .../noImplicitAnyStringIndexerOnObject.types | 14 ++++++++++++++ .../noImplicitAnyStringIndexerOnObject.ts | 6 ++++++ 6 files changed, 54 insertions(+), 2 deletions(-) diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 732630d7d9f5a..b218441d0edbb 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -4755,7 +4755,7 @@ namespace ts { if (isPropertyAccessExpression(expr)) { const baseStr = tryGetPropertyAccessOrIdentifierToString(expr.expression); if (baseStr !== undefined) { - return baseStr + "." + expr.name; + return baseStr + "." + entityNameToString(expr.name); } } else if (isIdentifier(expr)) { diff --git a/tests/baselines/reference/noImplicitAnyStringIndexerOnObject.errors.txt b/tests/baselines/reference/noImplicitAnyStringIndexerOnObject.errors.txt index 729c8236abd42..9e547245d9475 100644 --- a/tests/baselines/reference/noImplicitAnyStringIndexerOnObject.errors.txt +++ b/tests/baselines/reference/noImplicitAnyStringIndexerOnObject.errors.txt @@ -35,9 +35,10 @@ tests/cases/compiler/noImplicitAnyStringIndexerOnObject.ts(76,1): error TS7053: tests/cases/compiler/noImplicitAnyStringIndexerOnObject.ts(81,1): error TS7053: Element implicitly has an 'any' type because expression of type 'StrEnum' can't be used to index type '{ a: number; }'. Property '[StrEnum.b]' does not exist on type '{ a: number; }'. tests/cases/compiler/noImplicitAnyStringIndexerOnObject.ts(93,5): error TS2538: Type 'Dog' cannot be used as an index type. +tests/cases/compiler/noImplicitAnyStringIndexerOnObject.ts(99,1): error TS7052: Element implicitly has an 'any' type because type 'MyMap' has no index signature. Did you mean to call 'm.prop.get'? -==== tests/cases/compiler/noImplicitAnyStringIndexerOnObject.ts (30 errors) ==== +==== tests/cases/compiler/noImplicitAnyStringIndexerOnObject.ts (31 errors) ==== var a = {}["hello"]; ~~~~~~~~~~~ !!! error TS7053: Element implicitly has an 'any' type because expression of type '"hello"' can't be used to index type '{}'. @@ -198,4 +199,12 @@ tests/cases/compiler/noImplicitAnyStringIndexerOnObject.ts(93,5): error TS2538: map[rover] = "Rover"; ~~~~~ !!! error TS2538: Type 'Dog' cannot be used as an index type. + + interface I { + prop: MyMap + } + declare const m: I; + m.prop['a']; + ~~~~~~~~~~~ +!!! error TS7052: Element implicitly has an 'any' type because type 'MyMap' has no index signature. Did you mean to call 'm.prop.get'? \ No newline at end of file diff --git a/tests/baselines/reference/noImplicitAnyStringIndexerOnObject.js b/tests/baselines/reference/noImplicitAnyStringIndexerOnObject.js index aade38856d0c3..2d3b613a023e3 100644 --- a/tests/baselines/reference/noImplicitAnyStringIndexerOnObject.js +++ b/tests/baselines/reference/noImplicitAnyStringIndexerOnObject.js @@ -92,6 +92,12 @@ let rover: Dog = { bark() {} }; declare let map: MyMap; map[rover] = "Rover"; + +interface I { + prop: MyMap +} +declare const m: I; +m.prop['a']; //// [noImplicitAnyStringIndexerOnObject.js] @@ -168,3 +174,4 @@ var strEnumKey; o[strEnumKey]; var rover = { bark: function () { } }; map[rover] = "Rover"; +m.prop['a']; diff --git a/tests/baselines/reference/noImplicitAnyStringIndexerOnObject.symbols b/tests/baselines/reference/noImplicitAnyStringIndexerOnObject.symbols index 173616239655b..0eda5fa9c3672 100644 --- a/tests/baselines/reference/noImplicitAnyStringIndexerOnObject.symbols +++ b/tests/baselines/reference/noImplicitAnyStringIndexerOnObject.symbols @@ -277,3 +277,19 @@ map[rover] = "Rover"; >map : Symbol(map, Decl(noImplicitAnyStringIndexerOnObject.ts, 91, 11)) >rover : Symbol(rover, Decl(noImplicitAnyStringIndexerOnObject.ts, 89, 3)) +interface I { +>I : Symbol(I, Decl(noImplicitAnyStringIndexerOnObject.ts, 92, 21)) + + prop: MyMap +>prop : Symbol(I.prop, Decl(noImplicitAnyStringIndexerOnObject.ts, 94, 13)) +>MyMap : Symbol(MyMap, Decl(noImplicitAnyStringIndexerOnObject.ts, 80, 14)) +} +declare const m: I; +>m : Symbol(m, Decl(noImplicitAnyStringIndexerOnObject.ts, 97, 13)) +>I : Symbol(I, Decl(noImplicitAnyStringIndexerOnObject.ts, 92, 21)) + +m.prop['a']; +>m.prop : Symbol(I.prop, Decl(noImplicitAnyStringIndexerOnObject.ts, 94, 13)) +>m : Symbol(m, Decl(noImplicitAnyStringIndexerOnObject.ts, 97, 13)) +>prop : Symbol(I.prop, Decl(noImplicitAnyStringIndexerOnObject.ts, 94, 13)) + diff --git a/tests/baselines/reference/noImplicitAnyStringIndexerOnObject.types b/tests/baselines/reference/noImplicitAnyStringIndexerOnObject.types index 4a12805418b68..20aa05cb40e8a 100644 --- a/tests/baselines/reference/noImplicitAnyStringIndexerOnObject.types +++ b/tests/baselines/reference/noImplicitAnyStringIndexerOnObject.types @@ -418,3 +418,17 @@ map[rover] = "Rover"; >rover : Dog >"Rover" : "Rover" +interface I { + prop: MyMap +>prop : MyMap +} +declare const m: I; +>m : I + +m.prop['a']; +>m.prop['a'] : any +>m.prop : MyMap +>m : I +>prop : MyMap +>'a' : "a" + diff --git a/tests/cases/compiler/noImplicitAnyStringIndexerOnObject.ts b/tests/cases/compiler/noImplicitAnyStringIndexerOnObject.ts index a9b11e29034f4..f550bd7bb4d0f 100644 --- a/tests/cases/compiler/noImplicitAnyStringIndexerOnObject.ts +++ b/tests/cases/compiler/noImplicitAnyStringIndexerOnObject.ts @@ -93,3 +93,9 @@ let rover: Dog = { bark() {} }; declare let map: MyMap; map[rover] = "Rover"; + +interface I { + prop: MyMap +} +declare const m: I; +m.prop['a'];