@@ -13219,9 +13219,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
13219
13219
// and T as the template type.
13220
13220
const typeParameter = getTypeParameterFromMappedType(type);
13221
13221
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);
13225
13226
const modifiersType = getApparentType(getModifiersTypeFromMappedType(type)); // The 'T' in 'keyof T'
13226
13227
const templateModifiers = getMappedTypeModifiers(type);
13227
13228
const include = keyofStringsOnly ? TypeFlags.StringLiteral : TypeFlags.StringOrNumberLiteralOrUnique;
@@ -13267,7 +13268,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
13267
13268
prop.links.keyType = keyType;
13268
13269
if (modifiersProp) {
13269
13270
prop.links.syntheticOrigin = modifiersProp;
13270
- prop.declarations = !nameType || isFilteringMappedType ? modifiersProp.declarations : undefined;
13271
+ prop.declarations = shouldLinkPropDeclarations ? modifiersProp.declarations : undefined;
13271
13272
}
13272
13273
members.set(propName, prop);
13273
13274
}
@@ -13400,6 +13401,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
13400
13401
return false;
13401
13402
}
13402
13403
13404
+ function isFilteringMappedType(type: MappedType): boolean {
13405
+ const nameType = getNameTypeFromMappedType(type);
13406
+ return !!nameType && isTypeAssignableTo(nameType, getTypeParameterFromMappedType(type));
13407
+ }
13408
+
13403
13409
function resolveStructuredTypeMembers(type: StructuredType): ResolvedType {
13404
13410
if (!(type as ResolvedType).members) {
13405
13411
if (type.flags & TypeFlags.Object) {
@@ -17528,8 +17534,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
17528
17534
// K is generic and N is assignable to P, instantiate E using a mapper that substitutes the index type for P.
17529
17535
// For example, for an index access { [P in K]: Box<T[P]> }[X], we construct the type Box<T[X]>.
17530
17536
if (isGenericMappedType(objectType)) {
17531
- const nameType = getNameTypeFromMappedType(objectType);
17532
- if (!nameType || isTypeAssignableTo(nameType, getTypeParameterFromMappedType(objectType))) {
17537
+ if (!getNameTypeFromMappedType(objectType) || isFilteringMappedType(objectType)) {
17533
17538
return type[cache] = mapType(substituteIndexedMappedType(objectType, type.indexType), t => getSimplifiedType(t, writing));
17534
17539
}
17535
17540
}
0 commit comments