From 481882cfdae22e48702e33ef123eca52839cff74 Mon Sep 17 00:00:00 2001 From: Gabrielle Date: Thu, 10 Feb 2022 22:32:18 +0100 Subject: [PATCH] Fixed incorrect substitution on index access on generic mapped type with key remapping --- src/compiler/checker.ts | 6 +++-- ...cessOnGenericMappedTypeWithKeyRemapping.js | 9 +++++++ ...nGenericMappedTypeWithKeyRemapping.symbols | 24 +++++++++++++++++++ ...sOnGenericMappedTypeWithKeyRemapping.types | 16 +++++++++++++ ...cessOnGenericMappedTypeWithKeyRemapping.ts | 4 ++++ 5 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/indexAccessOnGenericMappedTypeWithKeyRemapping.js create mode 100644 tests/baselines/reference/indexAccessOnGenericMappedTypeWithKeyRemapping.symbols create mode 100644 tests/baselines/reference/indexAccessOnGenericMappedTypeWithKeyRemapping.types create mode 100644 tests/cases/compiler/indexAccessOnGenericMappedTypeWithKeyRemapping.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 2830de0c49d98..9e49166676102 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -15567,8 +15567,10 @@ namespace ts { } function substituteIndexedMappedType(objectType: MappedType, index: Type) { - const mapper = createTypeMapper([getTypeParameterFromMappedType(objectType)], [index]); - const templateMapper = combineTypeMappers(objectType.mapper, mapper); + let templateMapper = objectType.mapper; + if (!objectType.declaration.nameType) { + templateMapper = combineTypeMappers(templateMapper, createTypeMapper([getTypeParameterFromMappedType(objectType)], [index])); + } return instantiateType(getTemplateTypeFromMappedType(objectType), templateMapper); } diff --git a/tests/baselines/reference/indexAccessOnGenericMappedTypeWithKeyRemapping.js b/tests/baselines/reference/indexAccessOnGenericMappedTypeWithKeyRemapping.js new file mode 100644 index 0000000000000..be63ec884ac67 --- /dev/null +++ b/tests/baselines/reference/indexAccessOnGenericMappedTypeWithKeyRemapping.js @@ -0,0 +1,9 @@ +//// [indexAccessOnGenericMappedTypeWithKeyRemapping.ts] +type Foo = { + [RemappedT in T as `get${RemappedT}`]: RemappedT; +}; +const get = (t: T, foo: Foo): T => foo[`get${t}`]; + + +//// [indexAccessOnGenericMappedTypeWithKeyRemapping.js] +var get = function (t, foo) { return foo["get".concat(t)]; }; diff --git a/tests/baselines/reference/indexAccessOnGenericMappedTypeWithKeyRemapping.symbols b/tests/baselines/reference/indexAccessOnGenericMappedTypeWithKeyRemapping.symbols new file mode 100644 index 0000000000000..4c64ea71d4d5c --- /dev/null +++ b/tests/baselines/reference/indexAccessOnGenericMappedTypeWithKeyRemapping.symbols @@ -0,0 +1,24 @@ +=== tests/cases/compiler/indexAccessOnGenericMappedTypeWithKeyRemapping.ts === +type Foo = { +>Foo : Symbol(Foo, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 0, 0)) +>T : Symbol(T, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 0, 9)) + + [RemappedT in T as `get${RemappedT}`]: RemappedT; +>RemappedT : Symbol(RemappedT, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 1, 5)) +>T : Symbol(T, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 0, 9)) +>RemappedT : Symbol(RemappedT, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 1, 5)) +>RemappedT : Symbol(RemappedT, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 1, 5)) + +}; +const get = (t: T, foo: Foo): T => foo[`get${t}`]; +>get : Symbol(get, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 3, 5)) +>T : Symbol(T, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 3, 13)) +>t : Symbol(t, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 3, 31)) +>T : Symbol(T, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 3, 13)) +>foo : Symbol(foo, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 3, 36)) +>Foo : Symbol(Foo, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 0, 0)) +>T : Symbol(T, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 3, 13)) +>T : Symbol(T, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 3, 13)) +>foo : Symbol(foo, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 3, 36)) +>t : Symbol(t, Decl(indexAccessOnGenericMappedTypeWithKeyRemapping.ts, 3, 31)) + diff --git a/tests/baselines/reference/indexAccessOnGenericMappedTypeWithKeyRemapping.types b/tests/baselines/reference/indexAccessOnGenericMappedTypeWithKeyRemapping.types new file mode 100644 index 0000000000000..9e4bd0225f6e4 --- /dev/null +++ b/tests/baselines/reference/indexAccessOnGenericMappedTypeWithKeyRemapping.types @@ -0,0 +1,16 @@ +=== tests/cases/compiler/indexAccessOnGenericMappedTypeWithKeyRemapping.ts === +type Foo = { +>Foo : Foo + + [RemappedT in T as `get${RemappedT}`]: RemappedT; +}; +const get = (t: T, foo: Foo): T => foo[`get${t}`]; +>get : (t: T, foo: Foo) => T +>(t: T, foo: Foo): T => foo[`get${t}`] : (t: T, foo: Foo) => T +>t : T +>foo : Foo +>foo[`get${t}`] : Foo[`get${T}`] +>foo : Foo +>`get${t}` : `get${T}` +>t : T + diff --git a/tests/cases/compiler/indexAccessOnGenericMappedTypeWithKeyRemapping.ts b/tests/cases/compiler/indexAccessOnGenericMappedTypeWithKeyRemapping.ts new file mode 100644 index 0000000000000..ffde5e10b05d5 --- /dev/null +++ b/tests/cases/compiler/indexAccessOnGenericMappedTypeWithKeyRemapping.ts @@ -0,0 +1,4 @@ +type Foo = { + [RemappedT in T as `get${RemappedT}`]: RemappedT; +}; +const get = (t: T, foo: Foo): T => foo[`get${t}`];