diff --git a/packages/eslint-plugin/src/rules/no-unnecessary-type-constraint.ts b/packages/eslint-plugin/src/rules/no-unnecessary-type-constraint.ts index 969dfbe8db2..7ca1106f717 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-type-constraint.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-type-constraint.ts @@ -1,5 +1,7 @@ import type { TSESLint, TSESTree } from '@typescript-eslint/utils'; import { AST_NODE_TYPES } from '@typescript-eslint/utils'; +import { extname } from 'path'; +import * as ts from 'typescript'; import * as util from '../util'; @@ -38,7 +40,24 @@ export default util.createRule({ [AST_NODE_TYPES.TSUnknownKeyword, 'unknown'], ]); - const inJsx = context.getFilename().toLowerCase().endsWith('tsx'); + function checkRequiresGenericDeclarationDisambiguation( + filename: string, + ): boolean { + const pathExt = extname(filename).toLocaleLowerCase(); + switch (pathExt) { + case ts.Extension.Cts: + case ts.Extension.Mts: + case ts.Extension.Tsx: + return true; + + default: + return false; + } + } + + const requiresGenericDeclarationDisambiguation = + checkRequiresGenericDeclarationDisambiguation(context.getFilename()); + const source = context.getSourceCode(); const checkNode = ( @@ -47,7 +66,7 @@ export default util.createRule({ ): void => { const constraint = unnecessaryConstraints.get(node.constraint.type); function shouldAddTrailingComma(): boolean { - if (!inArrowFunction || !inJsx) { + if (!inArrowFunction || !requiresGenericDeclarationDisambiguation) { return false; } // Only () => {} would need trailing comma diff --git a/packages/eslint-plugin/tests/rules/no-unnecessary-type-constraint.test.ts b/packages/eslint-plugin/tests/rules/no-unnecessary-type-constraint.test.ts index d96da6e779f..121378f78fd 100644 --- a/packages/eslint-plugin/tests/rules/no-unnecessary-type-constraint.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unnecessary-type-constraint.test.ts @@ -128,6 +128,46 @@ function data() {} }, }, }, + { + code: 'const data = () => {};', + errors: [ + { + data: { constraint: 'any', name: 'T' }, + messageId: 'unnecessaryConstraint', + endColumn: 28, + column: 15, + line: 1, + suggestions: [ + { + messageId: 'removeUnnecessaryConstraint', + data: { constraint: 'any' }, + output: `const data = () => {};`, + }, + ], + }, + ], + filename: 'file.mts', + }, + { + code: 'const data = () => {};', + errors: [ + { + data: { constraint: 'any', name: 'T' }, + messageId: 'unnecessaryConstraint', + endColumn: 28, + column: 15, + line: 1, + suggestions: [ + { + messageId: 'removeUnnecessaryConstraint', + data: { constraint: 'any' }, + output: `const data = () => {};`, + }, + ], + }, + ], + filename: 'file.cts', + }, { code: noFormat`const data = () => {};`, errors: [