Skip to content

Commit 1d6863a

Browse files
loosen number index check, fixes #15768
1 parent d03d107 commit 1d6863a

File tree

5 files changed

+24
-7
lines changed

5 files changed

+24
-7
lines changed

src/compiler/checker.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18758,13 +18758,12 @@ namespace ts {
1875818758
if (isTypeAssignableTo(indexType, getIndexType(objectType))) {
1875918759
return type;
1876018760
}
18761-
// Check if we're indexing with a numeric type and the object type is a generic
18762-
// type with a constraint that has a numeric index signature.
18763-
if (maybeTypeOfKind(objectType, TypeFlags.TypeVariable) && isTypeAssignableToKind(indexType, TypeFlags.NumberLike)) {
18764-
const constraint = getBaseConstraintOfType(objectType);
18765-
if (constraint && getIndexInfoOfType(constraint, IndexKind.Number)) {
18766-
return type;
18767-
}
18761+
// Check if we're indexing with a numeric type and if either object or index types
18762+
// is a generic type with a constraint that has a numeric index signature.
18763+
const typeOrConstraint = (tp: Type) => maybeTypeOfKind(tp, TypeFlags.TypeVariable) ? getBaseConstraintOfType(tp) || tp : tp;
18764+
if (isTypeAssignableToKind(typeOrConstraint(indexType), TypeFlags.NumberLike) &&
18765+
getIndexInfoOfType(typeOrConstraint(objectType), IndexKind.Number)) {
18766+
return type;
1876818767
}
1876918768
error(accessNode, Diagnostics.Type_0_cannot_be_used_to_index_type_1, typeToString(indexType), typeToString(objectType));
1877018769
return type;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
//// [genericNumberIndex.ts]
2+
type X<I extends number> = ['a'][I];
3+
4+
5+
//// [genericNumberIndex.js]
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
=== tests/cases/compiler/genericNumberIndex.ts ===
2+
type X<I extends number> = ['a'][I];
3+
>X : Symbol(X, Decl(genericNumberIndex.ts, 0, 0))
4+
>I : Symbol(I, Decl(genericNumberIndex.ts, 0, 7))
5+
>I : Symbol(I, Decl(genericNumberIndex.ts, 0, 7))
6+
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
=== tests/cases/compiler/genericNumberIndex.ts ===
2+
type X<I extends number> = ['a'][I];
3+
>X : ["a"][I]
4+
>I : I
5+
>I : I
6+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
type X<I extends number> = ['a'][I];

0 commit comments

Comments
 (0)