From a0da01bbd94298a27a494d19dd98f858e23b334e Mon Sep 17 00:00:00 2001 From: Hasegawa-Yukihiro Date: Sat, 16 Aug 2025 23:26:52 +0900 Subject: [PATCH 1/3] fix: disable suggestion when non-null assertion is used as an assignee --- packages/eslint-plugin/src/rules/no-non-null-assertion.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/rules/no-non-null-assertion.ts b/packages/eslint-plugin/src/rules/no-non-null-assertion.ts index fd66c1cef9b0..bc7c9ecf226e 100644 --- a/packages/eslint-plugin/src/rules/no-non-null-assertion.ts +++ b/packages/eslint-plugin/src/rules/no-non-null-assertion.ts @@ -4,6 +4,7 @@ import { AST_NODE_TYPES } from '@typescript-eslint/utils'; import { createRule, + isAssignee, isNonNullAssertionPunctuator, nullThrows, NullThrowsReasons, @@ -53,7 +54,8 @@ export default createRule<[], MessageIds>({ if ( node.parent.type === AST_NODE_TYPES.MemberExpression && - node.parent.object === node + node.parent.object === node && + !isAssignee(node.parent) ) { if (!node.parent.optional) { if (node.parent.computed) { From f0feb9e954e6589eecb02cf391db7479d2644dc9 Mon Sep 17 00:00:00 2001 From: Hasegawa-Yukihiro Date: Sat, 16 Aug 2025 23:27:54 +0900 Subject: [PATCH 2/3] test: add tests --- .../tests/rules/no-non-null-assertion.test.ts | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/packages/eslint-plugin/tests/rules/no-non-null-assertion.test.ts b/packages/eslint-plugin/tests/rules/no-non-null-assertion.test.ts index 98dde42f9943..6c0e5bc7a8db 100644 --- a/packages/eslint-plugin/tests/rules/no-non-null-assertion.test.ts +++ b/packages/eslint-plugin/tests/rules/no-non-null-assertion.test.ts @@ -387,5 +387,39 @@ x?. }, ], }, + { + code: noFormat` +document.querySelector("input")!.files = new FileList(); +`, + errors: [ + { + column: 1, + endColumn: 33, + line: 2, + messageId: 'noNonNull', + }, + ], + }, + { + code: noFormat` +hoge.files = document.querySelector("input")!.files +`, + errors: [ + { + column: 14, + endColumn: 46, + line: 2, + messageId: 'noNonNull', + suggestions: [ + { + messageId: 'suggestOptionalChain', + output: ` +hoge.files = document.querySelector("input")?.files +`, + }, + ], + }, + ], + }, ], }); From 9aaa5258e35403bd2f67544d6b2ffd6969792ff5 Mon Sep 17 00:00:00 2001 From: Hasegawa-Yukihiro Date: Sat, 16 Aug 2025 23:45:38 +0900 Subject: [PATCH 3/3] chore: fix lint errors --- packages/eslint-plugin/src/rules/naming-convention.ts | 2 +- .../eslint-plugin/tests/rules/no-non-null-assertion.test.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/eslint-plugin/src/rules/naming-convention.ts b/packages/eslint-plugin/src/rules/naming-convention.ts index 02b95a5948fc..253842228a4e 100644 --- a/packages/eslint-plugin/src/rules/naming-convention.ts +++ b/packages/eslint-plugin/src/rules/naming-convention.ts @@ -634,7 +634,7 @@ export default createRule({ TSEnumMember: { handler: (node: TSESTree.TSEnumMember, validator): void => { // Unknown reason, can't get the correct type - const id = node.id as TSESTree.Identifier | TSESTree.StringLiteral; + const id = node.id; const modifiers = new Set(); if (requiresQuoting(id, compilerOptions.target)) { diff --git a/packages/eslint-plugin/tests/rules/no-non-null-assertion.test.ts b/packages/eslint-plugin/tests/rules/no-non-null-assertion.test.ts index 6c0e5bc7a8db..74828457790e 100644 --- a/packages/eslint-plugin/tests/rules/no-non-null-assertion.test.ts +++ b/packages/eslint-plugin/tests/rules/no-non-null-assertion.test.ts @@ -390,7 +390,7 @@ x?. { code: noFormat` document.querySelector("input")!.files = new FileList(); -`, + `, errors: [ { column: 1, @@ -403,7 +403,7 @@ document.querySelector("input")!.files = new FileList(); { code: noFormat` hoge.files = document.querySelector("input")!.files -`, + `, errors: [ { column: 14,