@@ -4606,7 +4606,7 @@ namespace ts {
4606
4606
// Create a mapper from T to the current iteration type constituent. Then, if the
4607
4607
// mapped type is itself an instantiated type, combine the iteration mapper with the
4608
4608
// instantiation mapper.
4609
- const iterationMapper = createUnaryTypeMapper( typeParameter, t );
4609
+ const iterationMapper = createTypeMapper([ typeParameter], [t] );
4610
4610
const templateMapper = type.mapper ? combineTypeMappers(type.mapper, iterationMapper) : iterationMapper;
4611
4611
const propType = instantiateType(templateType, templateMapper);
4612
4612
// If the current iteration type constituent is a string literal type, create a property.
@@ -4666,7 +4666,7 @@ namespace ts {
4666
4666
}
4667
4667
4668
4668
function getErasedTemplateTypeFromMappedType(type: MappedType) {
4669
- return instantiateType(getTemplateTypeFromMappedType(type), createUnaryTypeMapper( getTypeParameterFromMappedType(type), anyType ));
4669
+ return instantiateType(getTemplateTypeFromMappedType(type), createTypeEraser([ getTypeParameterFromMappedType(type)] ));
4670
4670
}
4671
4671
4672
4672
function isGenericMappedType(type: Type) {
@@ -6135,7 +6135,7 @@ namespace ts {
6135
6135
error(accessExpression, Diagnostics.Index_signature_in_type_0_only_permits_reading, typeToString(type));
6136
6136
return unknownType;
6137
6137
}
6138
- const mapper = createUnaryTypeMapper( getTypeParameterFromMappedType(type), indexType);
6138
+ const mapper = createTypeMapper([ getTypeParameterFromMappedType(type)], [ indexType] );
6139
6139
const templateMapper = type.mapper ? combineTypeMappers(type.mapper, mapper) : mapper;
6140
6140
return instantiateType(getTemplateTypeFromMappedType(type), templateMapper);
6141
6141
}
@@ -6502,16 +6502,16 @@ namespace ts {
6502
6502
return <T>instantiations[type.id] || (instantiations[type.id] = instantiator(type, mapper));
6503
6503
}
6504
6504
6505
- function createUnaryTypeMapper (source: Type, target: Type): TypeMapper {
6506
- return t => t === source ? target : t;
6505
+ function makeUnaryTypeMapper (source: Type, target: Type) {
6506
+ return (t: Type) => t === source ? target : t;
6507
6507
}
6508
6508
6509
- function createBinaryTypeMapper (source1: Type, target1: Type, source2: Type, target2: Type): TypeMapper {
6510
- return t => t === source1 ? target1 : t === source2 ? target2 : t;
6509
+ function makeBinaryTypeMapper (source1: Type, target1: Type, source2: Type, target2: Type) {
6510
+ return (t: Type) => t === source1 ? target1 : t === source2 ? target2 : t;
6511
6511
}
6512
6512
6513
- function createArrayTypeMapper (sources: Type[], targets: Type[]): TypeMapper {
6514
- return t => {
6513
+ function makeArrayTypeMapper (sources: Type[], targets: Type[]) {
6514
+ return (t: Type) => {
6515
6515
for (let i = 0; i < sources.length; i++) {
6516
6516
if (t === sources[i]) {
6517
6517
return targets ? targets[i] : anyType;
@@ -6522,11 +6522,9 @@ namespace ts {
6522
6522
}
6523
6523
6524
6524
function createTypeMapper(sources: Type[], targets: Type[]): TypeMapper {
6525
- const count = sources.length;
6526
- const mapper: TypeMapper =
6527
- count == 1 ? createUnaryTypeMapper(sources[0], targets ? targets[0] : anyType) :
6528
- count == 2 ? createBinaryTypeMapper(sources[0], targets ? targets[0] : anyType, sources[1], targets ? targets[1] : anyType) :
6529
- createArrayTypeMapper(sources, targets);
6525
+ const mapper: TypeMapper = sources.length === 1 ? makeUnaryTypeMapper(sources[0], targets ? targets[0] : anyType) :
6526
+ sources.length === 2 ? makeBinaryTypeMapper(sources[0], targets ? targets[0] : anyType, sources[1], targets ? targets[1] : anyType) :
6527
+ makeArrayTypeMapper(sources, targets);
6530
6528
mapper.mappedTypes = sources;
6531
6529
return mapper;
6532
6530
}
@@ -6560,7 +6558,7 @@ namespace ts {
6560
6558
6561
6559
function combineTypeMappers(mapper1: TypeMapper, mapper2: TypeMapper): TypeMapper {
6562
6560
const mapper: TypeMapper = t => instantiateType(mapper1(t), mapper2);
6563
- mapper.mappedTypes = mapper1.mappedTypes;
6561
+ mapper.mappedTypes = concatenate( mapper1.mappedTypes, mapper2.mappedTypes) ;
6564
6562
return mapper;
6565
6563
}
6566
6564
@@ -6662,7 +6660,7 @@ namespace ts {
6662
6660
if (typeVariable !== mappedTypeVariable) {
6663
6661
return mapType(mappedTypeVariable, t => {
6664
6662
if (isMappableType(t)) {
6665
- const replacementMapper = createUnaryTypeMapper( typeVariable, t );
6663
+ const replacementMapper = createTypeMapper([ typeVariable], [t] );
6666
6664
const combinedMapper = mapper.mappedTypes && mapper.mappedTypes.length === 1 ? replacementMapper : combineTypeMappers(replacementMapper, mapper);
6667
6665
combinedMapper.mappedTypes = mapper.mappedTypes;
6668
6666
return instantiateMappedObjectType(type, combinedMapper);
0 commit comments