Skip to content

Commit 9441555

Browse files
committed
Properly construct replacement mapper in mapped type instantiation
1 parent 5b075ff commit 9441555

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

src/compiler/checker.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6564,6 +6564,12 @@ namespace ts {
65646564
return mapper;
65656565
}
65666566

6567+
function createReplacementMapper(source: Type, target: Type, baseMapper: TypeMapper) {
6568+
const mapper: TypeMapper = t => t === source ? target : baseMapper(t);
6569+
mapper.mappedTypes = baseMapper.mappedTypes;
6570+
return mapper;
6571+
}
6572+
65676573
function cloneTypeParameter(typeParameter: TypeParameter): TypeParameter {
65686574
const result = <TypeParameter>createType(TypeFlags.TypeParameter);
65696575
result.symbol = typeParameter.symbol;
@@ -6662,10 +6668,7 @@ namespace ts {
66626668
if (typeVariable !== mappedTypeVariable) {
66636669
return mapType(mappedTypeVariable, t => {
66646670
if (isMappableType(t)) {
6665-
const replacementMapper = createUnaryTypeMapper(typeVariable, t);
6666-
const combinedMapper = mapper.mappedTypes && mapper.mappedTypes.length === 1 ? replacementMapper : combineTypeMappers(replacementMapper, mapper);
6667-
combinedMapper.mappedTypes = mapper.mappedTypes;
6668-
return instantiateMappedObjectType(type, combinedMapper);
6671+
return instantiateMappedObjectType(type, createReplacementMapper(typeVariable, t, mapper));
66696672
}
66706673
return t;
66716674
});

0 commit comments

Comments
 (0)