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..c380c3cb24f3 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,9 @@ function getTypeParametersFromNode( if ( ts.isCallExpression(tsNode) || ts.isNewExpression(tsNode) || - ts.isTaggedTemplateExpression(tsNode) + ts.isTaggedTemplateExpression(tsNode) || + ts.isJsxOpeningElement(tsNode) || + ts.isJsxSelfClosingElement(tsNode) ) { return getTypeParametersFromCall(node, tsNode, checker); } @@ -189,7 +191,12 @@ function getTypeParametersFromType( function getTypeParametersFromCall( node: TSESTree.TSTypeParameterInstantiation, - tsNode: ts.CallExpression | ts.NewExpression | ts.TaggedTemplateExpression, + tsNode: + | ts.CallExpression + | ts.JsxOpeningElement + | ts.JsxSelfClosingElement + | 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..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 @@ -179,6 +179,36 @@ namespace Foo { } class Bar extends Foo {} `, + { + code: ` +function Button() { + return
; +} +const button = >; + `, + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + }, + { + code: ` +function Button() { + return
; +} +const button = />; + `, + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + }, ], invalid: [ { @@ -560,5 +590,59 @@ 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 = ; + `, + }, + { + code: ` +function Button() { + return
; +} +const button = />; + `, + errors: [ + { + line: 5, + messageId: 'unnecessaryTypeParameter', + }, + ], + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + output: ` +function Button() { + return
; +} +const button =