@@ -13179,9 +13179,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
13179
13179
// and T as the template type.
13180
13180
const typeParameter = getTypeParameterFromMappedType(type);
13181
13181
const constraintType = getConstraintTypeFromMappedType(type);
13182
- const nameType = getNameTypeFromMappedType(type.target as MappedType || type);
13183
- const isFilteringMappedType = nameType && isTypeAssignableTo(nameType, typeParameter);
13184
- const templateType = getTemplateTypeFromMappedType(type.target as MappedType || type);
13182
+ const mappedType = (type.target as MappedType) || type;
13183
+ const nameType = getNameTypeFromMappedType(mappedType);
13184
+ const shouldLinkPropDeclarations = !nameType || isFilteringMappedType(mappedType);
13185
+ const templateType = getTemplateTypeFromMappedType(mappedType);
13185
13186
const modifiersType = getApparentType(getModifiersTypeFromMappedType(type)); // The 'T' in 'keyof T'
13186
13187
const templateModifiers = getMappedTypeModifiers(type);
13187
13188
const include = keyofStringsOnly ? TypeFlags.StringLiteral : TypeFlags.StringOrNumberLiteralOrUnique;
@@ -13227,7 +13228,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
13227
13228
prop.links.keyType = keyType;
13228
13229
if (modifiersProp) {
13229
13230
prop.links.syntheticOrigin = modifiersProp;
13230
- prop.declarations = !nameType || isFilteringMappedType ? modifiersProp.declarations : undefined;
13231
+ prop.declarations = shouldLinkPropDeclarations ? modifiersProp.declarations : undefined;
13231
13232
}
13232
13233
members.set(propName, prop);
13233
13234
}
@@ -13360,6 +13361,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
13360
13361
return false;
13361
13362
}
13362
13363
13364
+ function isFilteringMappedType(type: MappedType): boolean {
13365
+ const nameType = getNameTypeFromMappedType(type);
13366
+ return !!nameType && isTypeAssignableTo(nameType, getTypeParameterFromMappedType(type));
13367
+ }
13368
+
13363
13369
function resolveStructuredTypeMembers(type: StructuredType): ResolvedType {
13364
13370
if (!(type as ResolvedType).members) {
13365
13371
if (type.flags & TypeFlags.Object) {
@@ -17488,8 +17494,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
17488
17494
// K is generic and N is assignable to P, instantiate E using a mapper that substitutes the index type for P.
17489
17495
// For example, for an index access { [P in K]: Box<T[P]> }[X], we construct the type Box<T[X]>.
17490
17496
if (isGenericMappedType(objectType)) {
17491
- const nameType = getNameTypeFromMappedType(objectType);
17492
- if (!nameType || isTypeAssignableTo(nameType, getTypeParameterFromMappedType(objectType))) {
17497
+ if (!getNameTypeFromMappedType(objectType) || isFilteringMappedType(objectType)) {
17493
17498
return type[cache] = mapType(substituteIndexedMappedType(objectType, type.indexType), t => getSimplifiedType(t, writing));
17494
17499
}
17495
17500
}
0 commit comments