From b6ec9512076a30f2c635cb58e59282ea6df6ca5b Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Thu, 27 Jul 2017 09:50:57 -0700 Subject: [PATCH] Add missing check in getIndexedAccessForMappedType --- src/compiler/checker.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ec9867fa9b7..05b06860ecf 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7573,10 +7573,16 @@ namespace ts { } function getIndexedAccessForMappedType(type: MappedType, indexType: Type, accessNode?: ElementAccessExpression | IndexedAccessTypeNode) { - const accessExpression = accessNode && accessNode.kind === SyntaxKind.ElementAccessExpression ? accessNode : undefined; - if (accessExpression && isAssignmentTarget(accessExpression) && type.declaration.readonlyToken) { - error(accessExpression, Diagnostics.Index_signature_in_type_0_only_permits_reading, typeToString(type)); - return unknownType; + if (accessNode) { + // Check if the index type is assignable to 'keyof T' for the object type. + if (!isTypeAssignableTo(indexType, getIndexType(type))) { + error(accessNode, Diagnostics.Type_0_cannot_be_used_to_index_type_1, typeToString(indexType), typeToString(type)); + return unknownType; + } + if (accessNode.kind === SyntaxKind.ElementAccessExpression && isAssignmentTarget(accessNode) && type.declaration.readonlyToken) { + error(accessNode, Diagnostics.Index_signature_in_type_0_only_permits_reading, typeToString(type)); + return unknownType; + } } const mapper = createTypeMapper([getTypeParameterFromMappedType(type)], [indexType]); const templateMapper = type.mapper ? combineTypeMappers(type.mapper, mapper) : mapper;