Skip to content

Commit 523aca2

Browse files
committed
Property track mapped types in combined type mappers
1 parent 5b075ff commit 523aca2

File tree

1 file changed

+14
-16
lines changed

1 file changed

+14
-16
lines changed

src/compiler/checker.ts

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4606,7 +4606,7 @@ namespace ts {
46064606
// Create a mapper from T to the current iteration type constituent. Then, if the
46074607
// mapped type is itself an instantiated type, combine the iteration mapper with the
46084608
// instantiation mapper.
4609-
const iterationMapper = createUnaryTypeMapper(typeParameter, t);
4609+
const iterationMapper = createTypeMapper([typeParameter], [t]);
46104610
const templateMapper = type.mapper ? combineTypeMappers(type.mapper, iterationMapper) : iterationMapper;
46114611
const propType = instantiateType(templateType, templateMapper);
46124612
// If the current iteration type constituent is a string literal type, create a property.
@@ -4666,7 +4666,7 @@ namespace ts {
46664666
}
46674667

46684668
function getErasedTemplateTypeFromMappedType(type: MappedType) {
4669-
return instantiateType(getTemplateTypeFromMappedType(type), createUnaryTypeMapper(getTypeParameterFromMappedType(type), anyType));
4669+
return instantiateType(getTemplateTypeFromMappedType(type), createTypeEraser([getTypeParameterFromMappedType(type)]));
46704670
}
46714671

46724672
function isGenericMappedType(type: Type) {
@@ -6135,7 +6135,7 @@ namespace ts {
61356135
error(accessExpression, Diagnostics.Index_signature_in_type_0_only_permits_reading, typeToString(type));
61366136
return unknownType;
61376137
}
6138-
const mapper = createUnaryTypeMapper(getTypeParameterFromMappedType(type), indexType);
6138+
const mapper = createTypeMapper([getTypeParameterFromMappedType(type)], [indexType]);
61396139
const templateMapper = type.mapper ? combineTypeMappers(type.mapper, mapper) : mapper;
61406140
return instantiateType(getTemplateTypeFromMappedType(type), templateMapper);
61416141
}
@@ -6502,16 +6502,16 @@ namespace ts {
65026502
return <T>instantiations[type.id] || (instantiations[type.id] = instantiator(type, mapper));
65036503
}
65046504

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;
65076507
}
65086508

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;
65116511
}
65126512

6513-
function createArrayTypeMapper(sources: Type[], targets: Type[]): TypeMapper {
6514-
return t => {
6513+
function makeArrayTypeMapper(sources: Type[], targets: Type[]) {
6514+
return (t: Type) => {
65156515
for (let i = 0; i < sources.length; i++) {
65166516
if (t === sources[i]) {
65176517
return targets ? targets[i] : anyType;
@@ -6522,11 +6522,9 @@ namespace ts {
65226522
}
65236523

65246524
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);
65306528
mapper.mappedTypes = sources;
65316529
return mapper;
65326530
}
@@ -6560,7 +6558,7 @@ namespace ts {
65606558

65616559
function combineTypeMappers(mapper1: TypeMapper, mapper2: TypeMapper): TypeMapper {
65626560
const mapper: TypeMapper = t => instantiateType(mapper1(t), mapper2);
6563-
mapper.mappedTypes = mapper1.mappedTypes;
6561+
mapper.mappedTypes = concatenate(mapper1.mappedTypes, mapper2.mappedTypes);
65646562
return mapper;
65656563
}
65666564

@@ -6662,7 +6660,7 @@ namespace ts {
66626660
if (typeVariable !== mappedTypeVariable) {
66636661
return mapType(mappedTypeVariable, t => {
66646662
if (isMappableType(t)) {
6665-
const replacementMapper = createUnaryTypeMapper(typeVariable, t);
6663+
const replacementMapper = createTypeMapper([typeVariable], [t]);
66666664
const combinedMapper = mapper.mappedTypes && mapper.mappedTypes.length === 1 ? replacementMapper : combineTypeMappers(replacementMapper, mapper);
66676665
combinedMapper.mappedTypes = mapper.mappedTypes;
66686666
return instantiateMappedObjectType(type, combinedMapper);

0 commit comments

Comments
 (0)