Skip to content

Commit f37e783

Browse files
Fixed incorrect substitution on index access on generic mapped type with key remapping
1 parent eb3e7bd commit f37e783

5 files changed

+57
-2
lines changed

src/compiler/checker.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15500,8 +15500,10 @@ namespace ts {
1550015500
}
1550115501

1550215502
function substituteIndexedMappedType(objectType: MappedType, index: Type) {
15503-
const mapper = createTypeMapper([getTypeParameterFromMappedType(objectType)], [index]);
15504-
const templateMapper = combineTypeMappers(objectType.mapper, mapper);
15503+
let templateMapper = objectType.mapper;
15504+
if (!objectType.declaration.nameType) {
15505+
templateMapper = combineTypeMappers(templateMapper, createTypeMapper([getTypeParameterFromMappedType(objectType)], [index]));
15506+
}
1550515507
return instantiateType(getTemplateTypeFromMappedType(objectType), templateMapper);
1550615508
}
1550715509

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
//// [indexAccessOnGenericMappedTypeWithKeyRemapping.ts]
2+
type Foo<T extends string> = {
3+
[RemappedT in T as `get${RemappedT}`]: RemappedT;
4+
};
5+
const get = <T extends string>(t: T, foo: Foo<T>): T => foo[`get${t}`];
6+
7+
//// [indexAccessOnGenericMappedTypeWithKeyRemapping.js]
8+
var get = function (t, foo) { return foo["get".concat(t)]; };
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
=== tests/cases/compiler/indexAccessOnGenericMappedTypeWithKeyRemapping.ts ===
2+
type Foo<T extends string> = {
3+
>Foo : Symbol(Foo, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 0, 0))
4+
>T : Symbol(T, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 0, 9))
5+
6+
[RemappedT in T as `get${RemappedT}`]: RemappedT;
7+
>RemappedT : Symbol(RemappedT, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 1, 5))
8+
>T : Symbol(T, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 0, 9))
9+
>RemappedT : Symbol(RemappedT, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 1, 5))
10+
>RemappedT : Symbol(RemappedT, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 1, 5))
11+
12+
};
13+
const get = <T extends string>(t: T, foo: Foo<T>): T => foo[`get${t}`];
14+
>get : Symbol(get, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 3, 5))
15+
>T : Symbol(T, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 3, 13))
16+
>t : Symbol(t, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 3, 31))
17+
>T : Symbol(T, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 3, 13))
18+
>foo : Symbol(foo, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 3, 36))
19+
>Foo : Symbol(Foo, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 0, 0))
20+
>T : Symbol(T, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 3, 13))
21+
>T : Symbol(T, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 3, 13))
22+
>foo : Symbol(foo, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 3, 36))
23+
>t : Symbol(t, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 3, 31))
24+
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
=== tests/cases/compiler/indexAccessOnGenericMappedTypeWithKeyRemapping.ts ===
2+
type Foo<T extends string> = {
3+
>Foo : Foo<T>
4+
5+
[RemappedT in T as `get${RemappedT}`]: RemappedT;
6+
};
7+
const get = <T extends string>(t: T, foo: Foo<T>): T => foo[`get${t}`];
8+
>get : <T extends string>(t: T, foo: Foo<T>) => T
9+
><T extends string>(t: T, foo: Foo<T>): T => foo[`get${t}`] : <T extends string>(t: T, foo: Foo<T>) => T
10+
>t : T
11+
>foo : Foo<T>
12+
>foo[`get${t}`] : Foo<T>[`get${T}`]
13+
>foo : Foo<T>
14+
>`get${t}` : `get${T}`
15+
>t : T
16+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
type Foo<T extends string> = {
2+
[RemappedT in T as `get${RemappedT}`]: RemappedT;
3+
};
4+
const get = <T extends string>(t: T, foo: Foo<T>): T => foo[`get${t}`];
5+

0 commit comments

Comments
 (0)