@@ -10400,12 +10400,11 @@ namespace ts {
10400
10400
setStructuredTypeMembers(type, members, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
10401
10401
10402
10402
function addMemberForKeyType(keyType: Type) {
10403
- const mapper = appendTypeMapping(type.mapper, typeParameter, keyType);
10404
- const propNameType = nameType ? instantiateType(nameType, mapper) : keyType;
10405
- forEachType(propNameType, t => addMemberForKeyTypeWorker(keyType, t, mapper));
10403
+ const propNameType = nameType ? instantiateType(nameType, appendTypeMapping(type.mapper, typeParameter, keyType)) : keyType;
10404
+ forEachType(propNameType, t => addMemberForKeyTypeWorker(keyType, t));
10406
10405
}
10407
10406
10408
- function addMemberForKeyTypeWorker(keyType: Type, propNameType: Type, mapper: TypeMapper ) {
10407
+ function addMemberForKeyTypeWorker(keyType: Type, propNameType: Type) {
10409
10408
// If the current iteration type constituent is a string literal type, create a property.
10410
10409
// Otherwise, for type string create a string index signature.
10411
10410
if (isTypeUsableAsPropertyName(propNameType)) {
@@ -10416,8 +10415,7 @@ namespace ts {
10416
10415
const existingProp = members.get(propName) as MappedSymbol | undefined;
10417
10416
if (existingProp) {
10418
10417
existingProp.nameType = getUnionType([existingProp.nameType!, propNameType]);
10419
- const existingKeyType = instantiateType(typeParameter, existingProp.mapper);
10420
- existingProp.mapper = appendTypeMapping(type.mapper, typeParameter, getUnionType([existingKeyType, keyType]));
10418
+ existingProp.keyType = getUnionType([existingProp.keyType, keyType]);
10421
10419
}
10422
10420
else {
10423
10421
const modifiersProp = getPropertyOfType(modifiersType, propName);
@@ -10429,17 +10427,17 @@ namespace ts {
10429
10427
const prop = <MappedSymbol>createSymbol(SymbolFlags.Property | (isOptional ? SymbolFlags.Optional : 0), propName,
10430
10428
CheckFlags.Mapped | (isReadonly ? CheckFlags.Readonly : 0) | (stripOptional ? CheckFlags.StripOptional : 0));
10431
10429
prop.mappedType = type;
10430
+ prop.nameType = propNameType;
10431
+ prop.keyType = keyType;
10432
10432
if (modifiersProp) {
10433
10433
prop.syntheticOrigin = modifiersProp;
10434
10434
prop.declarations = modifiersProp.declarations;
10435
10435
}
10436
- prop.nameType = propNameType;
10437
- prop.mapper = mapper;
10438
10436
members.set(propName, prop);
10439
10437
}
10440
10438
}
10441
10439
else if (propNameType.flags & (TypeFlags.Any | TypeFlags.String | TypeFlags.Number | TypeFlags.Enum)) {
10442
- const propType = instantiateType(templateType, mapper);
10440
+ const propType = instantiateType(templateType, appendTypeMapping(type. mapper, typeParameter, keyType) );
10443
10441
if (propNameType.flags & (TypeFlags.Any | TypeFlags.String)) {
10444
10442
stringIndexInfo = createIndexInfo(stringIndexInfo ? getUnionType([stringIndexInfo.type, propType]) : propType,
10445
10443
!!(templateModifiers & MappedTypeModifiers.IncludeReadonly));
@@ -10454,24 +10452,25 @@ namespace ts {
10454
10452
10455
10453
function getTypeOfMappedSymbol(symbol: MappedSymbol) {
10456
10454
if (!symbol.type) {
10455
+ const mappedType = symbol.mappedType;
10457
10456
if (!pushTypeResolution(symbol, TypeSystemPropertyName.Type)) {
10458
- symbol. mappedType.containsError = true;
10457
+ mappedType.containsError = true;
10459
10458
return errorType;
10460
10459
}
10461
- const templateType = getTemplateTypeFromMappedType(<MappedType>symbol.mappedType.target || symbol.mappedType);
10462
- const propType = instantiateType(templateType, symbol.mapper);
10460
+ const templateType = getTemplateTypeFromMappedType(<MappedType>mappedType.target || mappedType);
10461
+ const mapper = appendTypeMapping(mappedType.mapper, getTypeParameterFromMappedType(mappedType), symbol.keyType);
10462
+ const propType = instantiateType(templateType, mapper);
10463
10463
// When creating an optional property in strictNullChecks mode, if 'undefined' isn't assignable to the
10464
10464
// type, we include 'undefined' in the type. Similarly, when creating a non-optional property in strictNullChecks
10465
10465
// mode, if the underlying property is optional we remove 'undefined' from the type.
10466
10466
let type = strictNullChecks && symbol.flags & SymbolFlags.Optional && !maybeTypeOfKind(propType, TypeFlags.Undefined | TypeFlags.Void) ? getOptionalType(propType) :
10467
10467
symbol.checkFlags & CheckFlags.StripOptional ? getTypeWithFacts(propType, TypeFacts.NEUndefined) :
10468
10468
propType;
10469
10469
if (!popTypeResolution()) {
10470
- error(currentNode, Diagnostics.Type_of_property_0_circularly_references_itself_in_mapped_type_1, symbolToString(symbol), typeToString(symbol. mappedType));
10470
+ error(currentNode, Diagnostics.Type_of_property_0_circularly_references_itself_in_mapped_type_1, symbolToString(symbol), typeToString(mappedType));
10471
10471
type = errorType;
10472
10472
}
10473
10473
symbol.type = type;
10474
- symbol.mapper = undefined!;
10475
10474
}
10476
10475
return symbol.type;
10477
10476
}
0 commit comments