Skip to content

Commit 5c71de1

Browse files
authored
Merge pull request #12652 from Microsoft/fixIndexedAccessWithAny
Indexed access 'any[K]' is of type any
2 parents b7e8a6d + ee172cf commit 5c71de1

File tree

5 files changed

+84
-0
lines changed

5 files changed

+84
-0
lines changed

src/compiler/checker.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6033,6 +6033,9 @@ namespace ts {
60336033

60346034
function getIndexedAccessType(objectType: Type, indexType: Type, accessNode?: ElementAccessExpression | IndexedAccessTypeNode) {
60356035
if (maybeTypeOfKind(indexType, TypeFlags.TypeVariable | TypeFlags.Index) || isGenericMappedType(objectType)) {
6036+
if (objectType.flags & TypeFlags.Any) {
6037+
return objectType;
6038+
}
60366039
// If the index type is generic or if the object type is a mapped type with a generic constraint,
60376040
// we are performing a higher-order index access where we cannot meaningfully access the properties
60386041
// of the object type. In those cases, we first check that the index type is assignable to 'keyof T'

tests/baselines/reference/keyofAndIndexedAccess.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,17 @@ interface Options2<Data, Computed> {
353353
declare class Component2<Data, Computed> {
354354
constructor(options: Options2<Data, Computed>);
355355
get<K extends keyof Data | keyof Computed>(key: K): (Data & Computed)[K];
356+
}
357+
358+
// Repro from #12641
359+
360+
interface R {
361+
p: number;
362+
}
363+
364+
function f<K extends keyof R>(p: K) {
365+
let a: any;
366+
a[p].add; // any
356367
}
357368

358369
//// [keyofAndIndexedAccess.js]
@@ -589,6 +600,10 @@ var c1 = new Component1({
589600
}
590601
});
591602
c1.get("hello");
603+
function f(p) {
604+
var a;
605+
a[p].add; // any
606+
}
592607

593608

594609
//// [keyofAndIndexedAccess.d.ts]
@@ -757,3 +772,7 @@ declare class Component2<Data, Computed> {
757772
constructor(options: Options2<Data, Computed>);
758773
get<K extends keyof Data | keyof Computed>(key: K): (Data & Computed)[K];
759774
}
775+
interface R {
776+
p: number;
777+
}
778+
declare function f<K extends keyof R>(p: K): void;

tests/baselines/reference/keyofAndIndexedAccess.symbols

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1320,3 +1320,27 @@ declare class Component2<Data, Computed> {
13201320
>Computed : Symbol(Computed, Decl(keyofAndIndexedAccess.ts, 351, 30))
13211321
>K : Symbol(K, Decl(keyofAndIndexedAccess.ts, 353, 8))
13221322
}
1323+
1324+
// Repro from #12641
1325+
1326+
interface R {
1327+
>R : Symbol(R, Decl(keyofAndIndexedAccess.ts, 354, 1))
1328+
1329+
p: number;
1330+
>p : Symbol(R.p, Decl(keyofAndIndexedAccess.ts, 358, 13))
1331+
}
1332+
1333+
function f<K extends keyof R>(p: K) {
1334+
>f : Symbol(f, Decl(keyofAndIndexedAccess.ts, 360, 1))
1335+
>K : Symbol(K, Decl(keyofAndIndexedAccess.ts, 362, 11))
1336+
>R : Symbol(R, Decl(keyofAndIndexedAccess.ts, 354, 1))
1337+
>p : Symbol(p, Decl(keyofAndIndexedAccess.ts, 362, 30))
1338+
>K : Symbol(K, Decl(keyofAndIndexedAccess.ts, 362, 11))
1339+
1340+
let a: any;
1341+
>a : Symbol(a, Decl(keyofAndIndexedAccess.ts, 363, 7))
1342+
1343+
a[p].add; // any
1344+
>a : Symbol(a, Decl(keyofAndIndexedAccess.ts, 363, 7))
1345+
>p : Symbol(p, Decl(keyofAndIndexedAccess.ts, 362, 30))
1346+
}

tests/baselines/reference/keyofAndIndexedAccess.types

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1560,3 +1560,30 @@ declare class Component2<Data, Computed> {
15601560
>Computed : Computed
15611561
>K : K
15621562
}
1563+
1564+
// Repro from #12641
1565+
1566+
interface R {
1567+
>R : R
1568+
1569+
p: number;
1570+
>p : number
1571+
}
1572+
1573+
function f<K extends keyof R>(p: K) {
1574+
>f : <K extends "p">(p: K) => void
1575+
>K : K
1576+
>R : R
1577+
>p : K
1578+
>K : K
1579+
1580+
let a: any;
1581+
>a : any
1582+
1583+
a[p].add; // any
1584+
>a[p].add : any
1585+
>a[p] : any
1586+
>a : any
1587+
>p : K
1588+
>add : any
1589+
}

tests/cases/conformance/types/keyof/keyofAndIndexedAccess.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,4 +354,15 @@ interface Options2<Data, Computed> {
354354
declare class Component2<Data, Computed> {
355355
constructor(options: Options2<Data, Computed>);
356356
get<K extends keyof Data | keyof Computed>(key: K): (Data & Computed)[K];
357+
}
358+
359+
// Repro from #12641
360+
361+
interface R {
362+
p: number;
363+
}
364+
365+
function f<K extends keyof R>(p: K) {
366+
let a: any;
367+
a[p].add; // any
357368
}

0 commit comments

Comments
 (0)