@@ -13219,9 +13219,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1321913219 // and T as the template type.
1322013220 const typeParameter = getTypeParameterFromMappedType(type);
1322113221 const constraintType = getConstraintTypeFromMappedType(type);
13222- const nameType = getNameTypeFromMappedType(type.target as MappedType || type);
13223- const isFilteringMappedType = nameType && isTypeAssignableTo(nameType, typeParameter);
13224- const templateType = getTemplateTypeFromMappedType(type.target as MappedType || type);
13222+ const mappedType = (type.target as MappedType) || type;
13223+ const nameType = getNameTypeFromMappedType(mappedType);
13224+ const shouldLinkPropDeclarations = !nameType || isFilteringMappedType(mappedType);
13225+ const templateType = getTemplateTypeFromMappedType(mappedType);
1322513226 const modifiersType = getApparentType(getModifiersTypeFromMappedType(type)); // The 'T' in 'keyof T'
1322613227 const templateModifiers = getMappedTypeModifiers(type);
1322713228 const include = keyofStringsOnly ? TypeFlags.StringLiteral : TypeFlags.StringOrNumberLiteralOrUnique;
@@ -13267,7 +13268,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1326713268 prop.links.keyType = keyType;
1326813269 if (modifiersProp) {
1326913270 prop.links.syntheticOrigin = modifiersProp;
13270- prop.declarations = !nameType || isFilteringMappedType ? modifiersProp.declarations : undefined;
13271+ prop.declarations = shouldLinkPropDeclarations ? modifiersProp.declarations : undefined;
1327113272 }
1327213273 members.set(propName, prop);
1327313274 }
@@ -13400,6 +13401,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1340013401 return false;
1340113402 }
1340213403
13404+ function isFilteringMappedType(type: MappedType): boolean {
13405+ const nameType = getNameTypeFromMappedType(type);
13406+ return !!nameType && isTypeAssignableTo(nameType, getTypeParameterFromMappedType(type));
13407+ }
13408+
1340313409 function resolveStructuredTypeMembers(type: StructuredType): ResolvedType {
1340413410 if (!(type as ResolvedType).members) {
1340513411 if (type.flags & TypeFlags.Object) {
@@ -17528,8 +17534,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1752817534 // K is generic and N is assignable to P, instantiate E using a mapper that substitutes the index type for P.
1752917535 // For example, for an index access { [P in K]: Box<T[P]> }[X], we construct the type Box<T[X]>.
1753017536 if (isGenericMappedType(objectType)) {
17531- const nameType = getNameTypeFromMappedType(objectType);
17532- if (!nameType || isTypeAssignableTo(nameType, getTypeParameterFromMappedType(objectType))) {
17537+ if (!getNameTypeFromMappedType(objectType) || isFilteringMappedType(objectType)) {
1753317538 return type[cache] = mapType(substituteIndexedMappedType(objectType, type.indexType), t => getSimplifiedType(t, writing));
1753417539 }
1753517540 }
0 commit comments