loosen number index check, fixes #15768
This commit is contained in:
parent
d03d1074ee
commit
1d6863ab0b
5 changed files with 24 additions and 7 deletions
|
@ -18758,13 +18758,12 @@ namespace ts {
|
||||||
if (isTypeAssignableTo(indexType, getIndexType(objectType))) {
|
if (isTypeAssignableTo(indexType, getIndexType(objectType))) {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
// Check if we're indexing with a numeric type and the object type is a generic
|
// Check if we're indexing with a numeric type and if either object or index types
|
||||||
// type with a constraint that has a numeric index signature.
|
// is a generic type with a constraint that has a numeric index signature.
|
||||||
if (maybeTypeOfKind(objectType, TypeFlags.TypeVariable) && isTypeAssignableToKind(indexType, TypeFlags.NumberLike)) {
|
const typeOrConstraint = (tp: Type) => maybeTypeOfKind(tp, TypeFlags.TypeVariable) ? getBaseConstraintOfType(tp) || tp : tp;
|
||||||
const constraint = getBaseConstraintOfType(objectType);
|
if (isTypeAssignableToKind(typeOrConstraint(indexType), TypeFlags.NumberLike) &&
|
||||||
if (constraint && getIndexInfoOfType(constraint, IndexKind.Number)) {
|
getIndexInfoOfType(typeOrConstraint(objectType), IndexKind.Number)) {
|
||||||
return type;
|
return type;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
error(accessNode, Diagnostics.Type_0_cannot_be_used_to_index_type_1, typeToString(indexType), typeToString(objectType));
|
error(accessNode, Diagnostics.Type_0_cannot_be_used_to_index_type_1, typeToString(indexType), typeToString(objectType));
|
||||||
return type;
|
return type;
|
||||||
|
|
5
tests/baselines/reference/genericNumberIndex.js
Normal file
5
tests/baselines/reference/genericNumberIndex.js
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
//// [genericNumberIndex.ts]
|
||||||
|
type X<I extends number> = ['a'][I];
|
||||||
|
|
||||||
|
|
||||||
|
//// [genericNumberIndex.js]
|
6
tests/baselines/reference/genericNumberIndex.symbols
Normal file
6
tests/baselines/reference/genericNumberIndex.symbols
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
=== tests/cases/compiler/genericNumberIndex.ts ===
|
||||||
|
type X<I extends number> = ['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))
|
||||||
|
|
6
tests/baselines/reference/genericNumberIndex.types
Normal file
6
tests/baselines/reference/genericNumberIndex.types
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
=== tests/cases/compiler/genericNumberIndex.ts ===
|
||||||
|
type X<I extends number> = ['a'][I];
|
||||||
|
>X : ["a"][I]
|
||||||
|
>I : I
|
||||||
|
>I : I
|
||||||
|
|
1
tests/cases/compiler/genericNumberIndex.ts
Normal file
1
tests/cases/compiler/genericNumberIndex.ts
Normal file
|
@ -0,0 +1 @@
|
||||||
|
type X<I extends number> = ['a'][I];
|
Loading…
Reference in a new issue