Correctly compute noUncheckedIndexedAccess effects on compound/increment/decrement assignments (#58239)

This commit is contained in:
Ryan Cavanaugh
2024-04-19 14:13:54 -07:00
committed by GitHub
parent 3480321b38
commit aedd1b1bb5
6 changed files with 356 additions and 4 deletions

View File

@@ -33031,7 +33031,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
error(node, Diagnostics.Index_signature_in_type_0_only_permits_reading, typeToString(apparentType));
}
propType = (compilerOptions.noUncheckedIndexedAccess && !isAssignmentTarget(node)) ? getUnionType([indexInfo.type, missingType]) : indexInfo.type;
propType = indexInfo.type;
if (compilerOptions.noUncheckedIndexedAccess && getAssignmentTargetKind(node) !== AssignmentKind.Definite) {
propType = getUnionType([propType, missingType]);
}
if (compilerOptions.noPropertyAccessFromIndexSignature && isPropertyAccessExpression(node)) {
error(right, Diagnostics.Property_0_comes_from_an_index_signature_so_it_must_be_accessed_with_0, unescapeLeadingUnderscores(right.escapedText));
}
@@ -33626,9 +33629,17 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
}
const effectiveIndexType = isForInVariableForNumericPropertyNames(indexExpression) ? numberType : indexType;
const accessFlags = isAssignmentTarget(node) ?
AccessFlags.Writing | (isGenericObjectType(objectType) && !isThisTypeParameter(objectType) ? AccessFlags.NoIndexSignatures : 0) :
AccessFlags.ExpressionPosition;
const assignmentTargetKind = getAssignmentTargetKind(node);
let accessFlags: AccessFlags;
if (assignmentTargetKind === AssignmentKind.None) {
accessFlags = AccessFlags.ExpressionPosition;
}
else {
accessFlags = AccessFlags.Writing | (isGenericObjectType(objectType) && !isThisTypeParameter(objectType) ? AccessFlags.NoIndexSignatures : 0);
if (assignmentTargetKind === AssignmentKind.Compound) {
accessFlags |= AccessFlags.ExpressionPosition;
}
}
const indexedAccessType = getIndexedAccessTypeOrUndefined(objectType, effectiveIndexType, accessFlags, node) || errorType;
return checkIndexedAccessIndexType(getFlowTypeOfAccessExpression(node, getNodeLinks(node).resolvedSymbol, indexedAccessType, indexExpression, checkMode), node);
}