From 6bb20ed973241b125549fcaee8b375c3c1c6c50d Mon Sep 17 00:00:00 2001 From: YeonJuan Date: Wed, 8 Jan 2025 00:14:41 +0900 Subject: [PATCH 1/2] fix(eslint-plugin): [no-unnecessary-type-arguments] handle type args on jsx --- .../rules/no-unnecessary-type-arguments.ts | 9 +++- .../no-unnecessary-type-arguments.test.ts | 42 +++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-unnecessary-type-arguments.ts b/packages/eslint-plugin/src/rules/no-unnecessary-type-arguments.ts index 95f0e66ccecc..caad90d40b41 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-type-arguments.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-type-arguments.ts @@ -142,7 +142,8 @@ function getTypeParametersFromNode( if ( ts.isCallExpression(tsNode) || ts.isNewExpression(tsNode) || - ts.isTaggedTemplateExpression(tsNode) + ts.isTaggedTemplateExpression(tsNode) || + ts.isJsxOpeningElement(tsNode) ) { return getTypeParametersFromCall(node, tsNode, checker); } @@ -189,7 +190,11 @@ function getTypeParametersFromType( function getTypeParametersFromCall( node: TSESTree.TSTypeParameterInstantiation, - tsNode: ts.CallExpression | ts.NewExpression | ts.TaggedTemplateExpression, + tsNode: + | ts.CallExpression + | ts.JsxOpeningElement + | ts.NewExpression + | ts.TaggedTemplateExpression, checker: ts.TypeChecker, ): readonly ts.TypeParameterDeclaration[] | undefined { const sig = checker.getResolvedSignature(tsNode); diff --git a/packages/eslint-plugin/tests/rules/no-unnecessary-type-arguments.test.ts b/packages/eslint-plugin/tests/rules/no-unnecessary-type-arguments.test.ts index ad4133e13ff4..b5aaf6ca6437 100644 --- a/packages/eslint-plugin/tests/rules/no-unnecessary-type-arguments.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unnecessary-type-arguments.test.ts @@ -179,6 +179,21 @@ namespace Foo { } class Bar extends Foo {} `, + { + code: ` +function Button() { + return
; +} +const button = >; + `, + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + }, ], invalid: [ { @@ -560,5 +575,32 @@ namespace Foo { class Bar extends Foo {} `, }, + { + code: ` +function Button() { + return
; +} +const button = >; + `, + errors: [ + { + line: 5, + messageId: 'unnecessaryTypeParameter', + }, + ], + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + output: ` +function Button() { + return
; +} +const button = ; + `, + }, ], }); From 672f5335156cfa4b3975a99cdad7b06201a2d936 Mon Sep 17 00:00:00 2001 From: YeonJuan Date: Fri, 10 Jan 2025 20:28:14 +0900 Subject: [PATCH 2/2] apply review --- .../rules/no-unnecessary-type-arguments.ts | 4 +- .../no-unnecessary-type-arguments.test.ts | 42 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/rules/no-unnecessary-type-arguments.ts b/packages/eslint-plugin/src/rules/no-unnecessary-type-arguments.ts index caad90d40b41..c380c3cb24f3 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-type-arguments.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-type-arguments.ts @@ -143,7 +143,8 @@ function getTypeParametersFromNode( ts.isCallExpression(tsNode) || ts.isNewExpression(tsNode) || ts.isTaggedTemplateExpression(tsNode) || - ts.isJsxOpeningElement(tsNode) + ts.isJsxOpeningElement(tsNode) || + ts.isJsxSelfClosingElement(tsNode) ) { return getTypeParametersFromCall(node, tsNode, checker); } @@ -193,6 +194,7 @@ function getTypeParametersFromCall( tsNode: | ts.CallExpression | ts.JsxOpeningElement + | ts.JsxSelfClosingElement | ts.NewExpression | ts.TaggedTemplateExpression, checker: ts.TypeChecker, diff --git a/packages/eslint-plugin/tests/rules/no-unnecessary-type-arguments.test.ts b/packages/eslint-plugin/tests/rules/no-unnecessary-type-arguments.test.ts index b5aaf6ca6437..18e74325d7b6 100644 --- a/packages/eslint-plugin/tests/rules/no-unnecessary-type-arguments.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unnecessary-type-arguments.test.ts @@ -194,6 +194,21 @@ const button = >; }, }, }, + { + code: ` +function Button() { + return
; +} +const button = />; + `, + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + }, ], invalid: [ { @@ -602,5 +617,32 @@ function Button() { const button = ; `, }, + { + code: ` +function Button() { + return
; +} +const button = />; + `, + errors: [ + { + line: 5, + messageId: 'unnecessaryTypeParameter', + }, + ], + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + output: ` +function Button() { + return
; +} +const button =