Skip to content

Commit 4c4d824

Browse files
ahejlsbergJack-Works
authored andcommitted
Store key type instead of type mapper in MappedSymbol
1 parent f51173e commit 4c4d824

File tree

2 files changed

+14
-15
lines changed

2 files changed

+14
-15
lines changed

src/compiler/checker.ts

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10400,12 +10400,11 @@ namespace ts {
1040010400
setStructuredTypeMembers(type, members, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
1040110401

1040210402
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));
1040610405
}
1040710406

10408-
function addMemberForKeyTypeWorker(keyType: Type, propNameType: Type, mapper: TypeMapper) {
10407+
function addMemberForKeyTypeWorker(keyType: Type, propNameType: Type) {
1040910408
// If the current iteration type constituent is a string literal type, create a property.
1041010409
// Otherwise, for type string create a string index signature.
1041110410
if (isTypeUsableAsPropertyName(propNameType)) {
@@ -10416,8 +10415,7 @@ namespace ts {
1041610415
const existingProp = members.get(propName) as MappedSymbol | undefined;
1041710416
if (existingProp) {
1041810417
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]);
1042110419
}
1042210420
else {
1042310421
const modifiersProp = getPropertyOfType(modifiersType, propName);
@@ -10429,17 +10427,17 @@ namespace ts {
1042910427
const prop = <MappedSymbol>createSymbol(SymbolFlags.Property | (isOptional ? SymbolFlags.Optional : 0), propName,
1043010428
CheckFlags.Mapped | (isReadonly ? CheckFlags.Readonly : 0) | (stripOptional ? CheckFlags.StripOptional : 0));
1043110429
prop.mappedType = type;
10430+
prop.nameType = propNameType;
10431+
prop.keyType = keyType;
1043210432
if (modifiersProp) {
1043310433
prop.syntheticOrigin = modifiersProp;
1043410434
prop.declarations = modifiersProp.declarations;
1043510435
}
10436-
prop.nameType = propNameType;
10437-
prop.mapper = mapper;
1043810436
members.set(propName, prop);
1043910437
}
1044010438
}
1044110439
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));
1044310441
if (propNameType.flags & (TypeFlags.Any | TypeFlags.String)) {
1044410442
stringIndexInfo = createIndexInfo(stringIndexInfo ? getUnionType([stringIndexInfo.type, propType]) : propType,
1044510443
!!(templateModifiers & MappedTypeModifiers.IncludeReadonly));
@@ -10454,24 +10452,25 @@ namespace ts {
1045410452

1045510453
function getTypeOfMappedSymbol(symbol: MappedSymbol) {
1045610454
if (!symbol.type) {
10455+
const mappedType = symbol.mappedType;
1045710456
if (!pushTypeResolution(symbol, TypeSystemPropertyName.Type)) {
10458-
symbol.mappedType.containsError = true;
10457+
mappedType.containsError = true;
1045910458
return errorType;
1046010459
}
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);
1046310463
// When creating an optional property in strictNullChecks mode, if 'undefined' isn't assignable to the
1046410464
// type, we include 'undefined' in the type. Similarly, when creating a non-optional property in strictNullChecks
1046510465
// mode, if the underlying property is optional we remove 'undefined' from the type.
1046610466
let type = strictNullChecks && symbol.flags & SymbolFlags.Optional && !maybeTypeOfKind(propType, TypeFlags.Undefined | TypeFlags.Void) ? getOptionalType(propType) :
1046710467
symbol.checkFlags & CheckFlags.StripOptional ? getTypeWithFacts(propType, TypeFacts.NEUndefined) :
1046810468
propType;
1046910469
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));
1047110471
type = errorType;
1047210472
}
1047310473
symbol.type = type;
10474-
symbol.mapper = undefined!;
1047510474
}
1047610475
return symbol.type;
1047710476
}

src/compiler/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4731,7 +4731,7 @@ namespace ts {
47314731
/* @internal */
47324732
export interface MappedSymbol extends TransientSymbol {
47334733
mappedType: MappedType;
4734-
mapper: TypeMapper;
4734+
keyType: Type;
47354735
}
47364736

47374737
/* @internal */

0 commit comments

Comments
 (0)