@@ -10399,24 +10399,25 @@ namespace ts {
10399
10399
}
10400
10400
setStructuredTypeMembers(type, members, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
10401
10401
10402
- function addMemberForKeyType(t : Type) {
10403
- const mapper = appendTypeMapping(type.mapper, typeParameter, t );
10404
- const propNameType = nameType ? instantiateType(nameType, mapper) : t ;
10405
- forEachType(propNameType, t => addMemberForKeyTypeWorker(t, mapper));
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));
10406
10406
}
10407
10407
10408
- function addMemberForKeyTypeWorker(t : Type, mapper: TypeMapper) {
10408
+ function addMemberForKeyTypeWorker(keyType: Type, propNameType : Type, mapper: TypeMapper) {
10409
10409
// If the current iteration type constituent is a string literal type, create a property.
10410
10410
// Otherwise, for type string create a string index signature.
10411
- if (isTypeUsableAsPropertyName(t )) {
10412
- const propName = getPropertyNameFromType(t );
10411
+ if (isTypeUsableAsPropertyName(propNameType )) {
10412
+ const propName = getPropertyNameFromType(propNameType );
10413
10413
// String enum members from separate enums with identical values
10414
10414
// are distinct types with the same property name. Make the resulting
10415
10415
// property symbol's name type be the union of those enum member types.
10416
10416
const existingProp = members.get(propName) as MappedSymbol | undefined;
10417
10417
if (existingProp) {
10418
- existingProp.nameType = getUnionType([existingProp.nameType!, t]);
10419
- existingProp.mapper = appendTypeMapping(type.mapper, typeParameter, existingProp.nameType);
10418
+ existingProp.nameType = getUnionType([existingProp.nameType!, propNameType]);
10419
+ const existingKeyType = instantiateType(typeParameter, existingProp.mapper);
10420
+ existingProp.mapper = appendTypeMapping(type.mapper, typeParameter, getUnionType([existingKeyType, keyType]));
10420
10421
}
10421
10422
else {
10422
10423
const modifiersProp = getPropertyOfType(modifiersType, propName);
@@ -10432,15 +10433,16 @@ namespace ts {
10432
10433
prop.syntheticOrigin = modifiersProp;
10433
10434
prop.declarations = modifiersProp.declarations;
10434
10435
}
10435
- prop.nameType = t ;
10436
+ prop.nameType = propNameType ;
10436
10437
prop.mapper = mapper;
10437
10438
members.set(propName, prop);
10438
10439
}
10439
10440
}
10440
- else if (t .flags & (TypeFlags.Any | TypeFlags.String | TypeFlags.Number | TypeFlags.Enum)) {
10441
+ else if (propNameType .flags & (TypeFlags.Any | TypeFlags.String | TypeFlags.Number | TypeFlags.Enum)) {
10441
10442
const propType = instantiateType(templateType, mapper);
10442
- if (t.flags & (TypeFlags.Any | TypeFlags.String)) {
10443
- stringIndexInfo = createIndexInfo(propType, !!(templateModifiers & MappedTypeModifiers.IncludeReadonly));
10443
+ if (propNameType.flags & (TypeFlags.Any | TypeFlags.String)) {
10444
+ stringIndexInfo = createIndexInfo(stringIndexInfo ? getUnionType([stringIndexInfo.type, propType]) : propType,
10445
+ !!(templateModifiers & MappedTypeModifiers.IncludeReadonly));
10444
10446
}
10445
10447
else {
10446
10448
numberIndexInfo = createIndexInfo(numberIndexInfo ? getUnionType([numberIndexInfo.type, propType]) : propType,
0 commit comments