diff --git a/packages/eslint-plugin/src/util/isAssignee.ts b/packages/eslint-plugin/src/util/isAssignee.ts index 9bf694827722..4183468ab4d9 100644 --- a/packages/eslint-plugin/src/util/isAssignee.ts +++ b/packages/eslint-plugin/src/util/isAssignee.ts @@ -53,5 +53,16 @@ export function isAssignee(node: TSESTree.Node): boolean { return true; } + // (a[i] as number)++, [...a[i]!] = [0], etc. + if ( + (parent.type === AST_NODE_TYPES.TSNonNullExpression || + parent.type === AST_NODE_TYPES.TSAsExpression || + parent.type === AST_NODE_TYPES.TSTypeAssertion || + parent.type === AST_NODE_TYPES.TSSatisfiesExpression) && + isAssignee(parent) + ) { + return true; + } + return false; } diff --git a/packages/eslint-plugin/tests/rules/prefer-for-of.test.ts b/packages/eslint-plugin/tests/rules/prefer-for-of.test.ts index 53a197f3f659..edc0e13519c8 100644 --- a/packages/eslint-plugin/tests/rules/prefer-for-of.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-for-of.test.ts @@ -139,6 +139,46 @@ for (let i = 0; i < arr.length; i++) { } `, ` +for (let i = 0; i < arr.length; i++) { + arr[i]++; +} + `, + ` +for (let i = 0; i < arr.length; i++) { + arr[i]!++; +} + `, + ` +for (let i = 0; i < arr.length; i++) { + arr[i]!!!++; +} + `, + ` +for (let i = 0; i < arr.length; i++) { + (arr[i] as number)++; +} + `, + ` +for (let i = 0; i < arr.length; i++) { + (arr[i])++; +} + `, + ` +for (let i = 0; i < arr.length; i++) { + (arr[i] as unknown as number)++; +} + `, + ` +for (let i = 0; i < arr.length; i++) { + (arr[i] satisfies number)++; +} + `, + ` +for (let i = 0; i < arr.length; i++) { + (arr[i]! satisfies number)++; +} + `, + ` for (let i = 0; i < arr.length; i++) { [arr[i]] = [1]; } @@ -149,6 +189,11 @@ for (let i = 0; i < arr.length; i++) { } `, ` +for (let i = 0; i < arr.length; i++) { + [...arr[i]!] = [1]; +} + `, + ` for (let i = 0; i < arr.length; i++) { ({ foo: arr[i] }) = { foo: 0 }; }