diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 903287707503c..9b274c469567a 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -18758,13 +18758,10 @@ namespace ts { if (isTypeAssignableTo(indexType, getIndexType(objectType))) { return type; } - // Check if we're indexing with a numeric type and the object type is a generic - // type with a constraint that has a numeric index signature. - if (maybeTypeOfKind(objectType, TypeFlags.TypeVariable) && isTypeAssignableToKind(indexType, TypeFlags.NumberLike)) { - const constraint = getBaseConstraintOfType(objectType); - if (constraint && getIndexInfoOfType(constraint, IndexKind.Number)) { - return type; - } + // Check if we're indexing with a numeric type and if either object or index types + // is a generic type with a constraint that has a numeric index signature. + if (getIndexInfoOfType(getApparentType(objectType), IndexKind.Number) && isTypeAssignableToKind(indexType, TypeFlags.NumberLike)) { + return type; } error(accessNode, Diagnostics.Type_0_cannot_be_used_to_index_type_1, typeToString(indexType), typeToString(objectType)); return type; diff --git a/tests/baselines/reference/genericNumberIndex.js b/tests/baselines/reference/genericNumberIndex.js new file mode 100644 index 0000000000000..c332d47001f87 --- /dev/null +++ b/tests/baselines/reference/genericNumberIndex.js @@ -0,0 +1,5 @@ +//// [genericNumberIndex.ts] +type X = ['a'][I]; + + +//// [genericNumberIndex.js] diff --git a/tests/baselines/reference/genericNumberIndex.symbols b/tests/baselines/reference/genericNumberIndex.symbols new file mode 100644 index 0000000000000..88a7f453390f1 --- /dev/null +++ b/tests/baselines/reference/genericNumberIndex.symbols @@ -0,0 +1,6 @@ +=== tests/cases/compiler/genericNumberIndex.ts === +type X = ['a'][I]; +>X : Symbol(X, Decl(genericNumberIndex.ts, 0, 0)) +>I : Symbol(I, Decl(genericNumberIndex.ts, 0, 7)) +>I : Symbol(I, Decl(genericNumberIndex.ts, 0, 7)) + diff --git a/tests/baselines/reference/genericNumberIndex.types b/tests/baselines/reference/genericNumberIndex.types new file mode 100644 index 0000000000000..36e9657a4c921 --- /dev/null +++ b/tests/baselines/reference/genericNumberIndex.types @@ -0,0 +1,6 @@ +=== tests/cases/compiler/genericNumberIndex.ts === +type X = ['a'][I]; +>X : ["a"][I] +>I : I +>I : I + diff --git a/tests/cases/compiler/genericNumberIndex.ts b/tests/cases/compiler/genericNumberIndex.ts new file mode 100644 index 0000000000000..c5aed2d474ec6 --- /dev/null +++ b/tests/cases/compiler/genericNumberIndex.ts @@ -0,0 +1 @@ +type X = ['a'][I];