From 5b7d8df149be6554c863cdd5b73c0b0b0a7960db Mon Sep 17 00:00:00 2001 From: islandryu <65934663+islandryu@users.noreply.github.com> Date: Sun, 13 Feb 2022 05:02:58 +0900 Subject: [PATCH] fix(eslint-plugin): [no-unnecessary-type-arguments] Use Symbol to check if it's the same type (#4543) Co-authored-by: Josh Goldberg --- .../rules/no-unnecessary-type-arguments.ts | 18 +++++++++---- .../no-unnecessary-type-arguments.test.ts | 27 +++++++++++++++++++ 2 files changed, 40 insertions(+), 5 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 67244961bca..318af6c6d01 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-type-arguments.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-type-arguments.ts @@ -37,7 +37,6 @@ export default util.createRule<[], MessageIds>({ create(context) { const parserServices = util.getParserServices(context); const checker = parserServices.program.getTypeChecker(); - const sourceCode = context.getSourceCode(); function checkTSArgsAndParameters( esParameters: TSESTree.TSTypeParameterInstantiation, @@ -47,11 +46,20 @@ export default util.createRule<[], MessageIds>({ const i = esParameters.params.length - 1; const arg = esParameters.params[i]; const param = typeParameters[i]; - + if (!param?.default) { + return; + } // TODO: would like checker.areTypesEquivalent. https://github.com/Microsoft/TypeScript/issues/13502 - if ( - !param?.default || - param.default.getText() !== sourceCode.getText(arg) + const defaultType = checker.getTypeAtLocation(param.default); + const argTsNode = parserServices.esTreeNodeToTSNodeMap.get(arg); + const argType = checker.getTypeAtLocation(argTsNode); + if (!argType.aliasSymbol && !defaultType.aliasSymbol) { + if (argType.flags !== defaultType.flags) { + return; + } + } else if ( + argType.aliasSymbol !== defaultType.aliasSymbol || + argType.aliasTypeArguments !== defaultType.aliasTypeArguments ) { return; } 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 9c642d5f88f..dc140aade44 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 @@ -290,5 +290,32 @@ function bar>() {} bar(); `, }, + { + code: ` +type DefaultE = { foo: string }; +type T = { box: E }; +type G = T; +declare module 'bar' { + type DefaultE = { somethingElse: true }; + type G = T; +} + `, + errors: [ + { + line: 4, + column: 12, + messageId: 'unnecessaryTypeParameter', + }, + ], + output: ` +type DefaultE = { foo: string }; +type T = { box: E }; +type G = T; +declare module 'bar' { + type DefaultE = { somethingElse: true }; + type G = T; +} + `, + }, ], });