@@ -13174,8 +13174,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
13174
13174
// and T as the template type.
13175
13175
const typeParameter = getTypeParameterFromMappedType(type);
13176
13176
const constraintType = getConstraintTypeFromMappedType(type);
13177
- const nameType = getNameTypeFromMappedType(type.target as MappedType || type);
13178
- const isFilteringMappedType = nameType && isTypeAssignableTo(nameType, typeParameter);
13177
+ const mappedType = (type.target as MappedType) || type;
13178
+ const nameType = getNameTypeFromMappedType(mappedType);
13179
+ const shouldLinkPropDeclarations = !nameType || isFilteringMappedType(mappedType);
13179
13180
const templateType = getTemplateTypeFromMappedType(type.target as MappedType || type);
13180
13181
const modifiersType = getApparentType(getModifiersTypeFromMappedType(type)); // The 'T' in 'keyof T'
13181
13182
const templateModifiers = getMappedTypeModifiers(type);
@@ -13222,7 +13223,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
13222
13223
prop.links.keyType = keyType;
13223
13224
if (modifiersProp) {
13224
13225
prop.links.syntheticOrigin = modifiersProp;
13225
- prop.declarations = !nameType || isFilteringMappedType ? modifiersProp.declarations : undefined;
13226
+ prop.declarations = shouldLinkPropDeclarations ? modifiersProp.declarations : undefined;
13226
13227
}
13227
13228
members.set(propName, prop);
13228
13229
}
@@ -13355,6 +13356,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
13355
13356
return false;
13356
13357
}
13357
13358
13359
+ function isFilteringMappedType(type: MappedType): boolean {
13360
+ const nameType = getNameTypeFromMappedType(type);
13361
+ return !!nameType && isTypeAssignableTo(nameType, getTypeParameterFromMappedType(type));
13362
+ }
13363
+
13358
13364
function resolveStructuredTypeMembers(type: StructuredType): ResolvedType {
13359
13365
if (!(type as ResolvedType).members) {
13360
13366
if (type.flags & TypeFlags.Object) {
@@ -17473,8 +17479,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
17473
17479
// K is generic and N is assignable to P, instantiate E using a mapper that substitutes the index type for P.
17474
17480
// For example, for an index access { [P in K]: Box<T[P]> }[X], we construct the type Box<T[X]>.
17475
17481
if (isGenericMappedType(objectType)) {
17476
- const nameType = getNameTypeFromMappedType(objectType);
17477
- if (!nameType || isTypeAssignableTo(nameType, getTypeParameterFromMappedType(objectType))) {
17482
+ if (!getNameTypeFromMappedType(objectType) || isFilteringMappedType(objectType)) {
17478
17483
return type[cache] = mapType(substituteIndexedMappedType(objectType, type.indexType), t => getSimplifiedType(t, writing));
17479
17484
}
17480
17485
}
0 commit comments