Skip to content

Commit b6ec951

Browse files
committed
Add missing check in getIndexedAccessForMappedType
1 parent 62ddc99 commit b6ec951

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

src/compiler/checker.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7573,10 +7573,16 @@ namespace ts {
75737573
}
75747574

75757575
function getIndexedAccessForMappedType(type: MappedType, indexType: Type, accessNode?: ElementAccessExpression | IndexedAccessTypeNode) {
7576-
const accessExpression = accessNode && accessNode.kind === SyntaxKind.ElementAccessExpression ? <ElementAccessExpression>accessNode : undefined;
7577-
if (accessExpression && isAssignmentTarget(accessExpression) && type.declaration.readonlyToken) {
7578-
error(accessExpression, Diagnostics.Index_signature_in_type_0_only_permits_reading, typeToString(type));
7579-
return unknownType;
7576+
if (accessNode) {
7577+
// Check if the index type is assignable to 'keyof T' for the object type.
7578+
if (!isTypeAssignableTo(indexType, getIndexType(type))) {
7579+
error(accessNode, Diagnostics.Type_0_cannot_be_used_to_index_type_1, typeToString(indexType), typeToString(type));
7580+
return unknownType;
7581+
}
7582+
if (accessNode.kind === SyntaxKind.ElementAccessExpression && isAssignmentTarget(accessNode) && type.declaration.readonlyToken) {
7583+
error(accessNode, Diagnostics.Index_signature_in_type_0_only_permits_reading, typeToString(type));
7584+
return unknownType;
7585+
}
75807586
}
75817587
const mapper = createTypeMapper([getTypeParameterFromMappedType(type)], [indexType]);
75827588
const templateMapper = type.mapper ? combineTypeMappers(type.mapper, mapper) : mapper;

0 commit comments

Comments
 (0)