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 820f4fbfd54..a32cb94728c 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-type-arguments.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-type-arguments.ts @@ -110,6 +110,10 @@ function getTypeParametersFromType( const sym = getAliasedSymbol(symAtLocation, checker); + if (!sym.declarations) { + return undefined; + } + return findFirstResult(sym.declarations, decl => tsutils.isClassLikeDeclaration(decl) || ts.isTypeAliasDeclaration(decl) || 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 df79528403d..51c1acf3285 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 @@ -6,6 +6,7 @@ const rootDir = path.join(process.cwd(), 'tests/fixtures'); const ruleTester = new RuleTester({ parserOptions: { ecmaVersion: 2015, + sourceType: 'module', tsconfigRootDir: rootDir, project: './tsconfig.json', }, @@ -74,6 +75,9 @@ ruleTester.run('no-unnecessary-type-arguments', rule, { class Foo extends Bar {}`, `interface Bar {} class Foo implements Bar {}`, + `import { F } from './missing'; + function bar() {} + bar>()`, ], invalid: [ { @@ -177,5 +181,20 @@ ruleTester.run('no-unnecessary-type-arguments', rule, { output: `class Bar {} class Foo extends Bar {}`, }, + { + code: `import { F } from './missing'; + function bar>() {} + bar>()`, + errors: [ + { + line: 3, + column: 13, + messageId: 'unnecessaryTypeParameter', + }, + ], + output: `import { F } from './missing'; + function bar>() {} + bar()`, + }, ], });