Skip to content

Commit 012fa84

Browse files
committed
Make generic arrays indexable by numericStringType
1 parent fbcdb8c commit 012fa84

4 files changed

+114
-1
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40252,7 +40252,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4025240252
// Check if we're indexing with a numeric type and if either object or index types
4025340253
// is a generic type with a constraint that has a numeric index signature.
4025440254
const apparentObjectType = getApparentType(objectType);
40255-
if (getIndexInfoOfType(apparentObjectType, numberType) && isTypeAssignableToKind(indexType, TypeFlags.NumberLike)) {
40255+
if (getIndexInfoOfType(apparentObjectType, numberType) && isApplicableIndexType(indexType, numberType)) {
4025640256
return type;
4025740257
}
4025840258
if (isGenericObjectType(objectType)) {
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
//// [tests/cases/compiler/typeParameterConstrainedToArrayIndexableByNumericStringType.ts] ////
2+
3+
=== typeParameterConstrainedToArrayIndexableByNumericStringType.ts ===
4+
// https://github.com/microsoft/TypeScript/issues/56823
5+
6+
declare function test1<A extends unknown[]>(arr: A): A[`${number}`];
7+
>test1 : Symbol(test1, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 0, 0))
8+
>A : Symbol(A, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 2, 23))
9+
>arr : Symbol(arr, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 2, 44))
10+
>A : Symbol(A, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 2, 23))
11+
>A : Symbol(A, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 2, 23))
12+
13+
const res1 = test1([1, 2, 3]);
14+
>res1 : Symbol(res1, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 3, 5))
15+
>test1 : Symbol(test1, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 0, 0))
16+
17+
declare function test2<A extends [unknown, unknown]>(arr: A): A[`${number}`];
18+
>test2 : Symbol(test2, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 3, 30))
19+
>A : Symbol(A, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 5, 23))
20+
>arr : Symbol(arr, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 5, 53))
21+
>A : Symbol(A, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 5, 23))
22+
>A : Symbol(A, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 5, 23))
23+
24+
const res2 = test2([1, 'foo']);
25+
>res2 : Symbol(res2, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 6, 5))
26+
>test2 : Symbol(test2, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 3, 30))
27+
28+
declare function test3<A extends [unknown, unknown, ...unknown[]]>(arr: A): A[`${number}`];
29+
>test3 : Symbol(test3, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 6, 31))
30+
>A : Symbol(A, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 8, 23))
31+
>arr : Symbol(arr, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 8, 67))
32+
>A : Symbol(A, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 8, 23))
33+
>A : Symbol(A, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 8, 23))
34+
35+
const res3 = test3([1, 'foo', true]);
36+
>res3 : Symbol(res3, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 9, 5))
37+
>test3 : Symbol(test3, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 6, 31))
38+
39+
declare const tuple1: [number, string, ...boolean[]];
40+
>tuple1 : Symbol(tuple1, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 10, 13))
41+
42+
const res4 = test3(tuple1);
43+
>res4 : Symbol(res4, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 11, 5))
44+
>test3 : Symbol(test3, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 6, 31))
45+
>tuple1 : Symbol(tuple1, Decl(typeParameterConstrainedToArrayIndexableByNumericStringType.ts, 10, 13))
46+
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
//// [tests/cases/compiler/typeParameterConstrainedToArrayIndexableByNumericStringType.ts] ////
2+
3+
=== typeParameterConstrainedToArrayIndexableByNumericStringType.ts ===
4+
// https://github.com/microsoft/TypeScript/issues/56823
5+
6+
declare function test1<A extends unknown[]>(arr: A): A[`${number}`];
7+
>test1 : <A extends unknown[]>(arr: A) => A[`${number}`]
8+
>arr : A
9+
10+
const res1 = test1([1, 2, 3]);
11+
>res1 : number
12+
>test1([1, 2, 3]) : number
13+
>test1 : <A extends unknown[]>(arr: A) => A[`${number}`]
14+
>[1, 2, 3] : number[]
15+
>1 : 1
16+
>2 : 2
17+
>3 : 3
18+
19+
declare function test2<A extends [unknown, unknown]>(arr: A): A[`${number}`];
20+
>test2 : <A extends [unknown, unknown]>(arr: A) => A[`${number}`]
21+
>arr : A
22+
23+
const res2 = test2([1, 'foo']);
24+
>res2 : string | number
25+
>test2([1, 'foo']) : string | number
26+
>test2 : <A extends [unknown, unknown]>(arr: A) => A[`${number}`]
27+
>[1, 'foo'] : [number, string]
28+
>1 : 1
29+
>'foo' : "foo"
30+
31+
declare function test3<A extends [unknown, unknown, ...unknown[]]>(arr: A): A[`${number}`];
32+
>test3 : <A extends [unknown, unknown, ...unknown[]]>(arr: A) => A[`${number}`]
33+
>arr : A
34+
35+
const res3 = test3([1, 'foo', true]);
36+
>res3 : string | number | boolean
37+
>test3([1, 'foo', true]) : string | number | boolean
38+
>test3 : <A extends [unknown, unknown, ...unknown[]]>(arr: A) => A[`${number}`]
39+
>[1, 'foo', true] : [number, string, true]
40+
>1 : 1
41+
>'foo' : "foo"
42+
>true : true
43+
44+
declare const tuple1: [number, string, ...boolean[]];
45+
>tuple1 : [number, string, ...boolean[]]
46+
47+
const res4 = test3(tuple1);
48+
>res4 : string | number | boolean
49+
>test3(tuple1) : string | number | boolean
50+
>test3 : <A extends [unknown, unknown, ...unknown[]]>(arr: A) => A[`${number}`]
51+
>tuple1 : [number, string, ...boolean[]]
52+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// @strict: true
2+
// @noEmit: true
3+
4+
// https://github.com/microsoft/TypeScript/issues/56823
5+
6+
declare function test1<A extends unknown[]>(arr: A): A[`${number}`];
7+
const res1 = test1([1, 2, 3]);
8+
9+
declare function test2<A extends [unknown, unknown]>(arr: A): A[`${number}`];
10+
const res2 = test2([1, 'foo']);
11+
12+
declare function test3<A extends [unknown, unknown, ...unknown[]]>(arr: A): A[`${number}`];
13+
const res3 = test3([1, 'foo', true]);
14+
declare const tuple1: [number, string, ...boolean[]];
15+
const res4 = test3(tuple1);

0 commit comments

Comments
 (0)