From 3456ba99dec4394b0e6e7774587ef4dc3855f33b Mon Sep 17 00:00:00 2001 From: YeonJuan Date: Sun, 9 Feb 2025 02:39:39 +0900 Subject: [PATCH 1/4] fix(eslint-plugin): [unified-signatures] handle getter-setter --- .../eslint-plugin/src/rules/unified-signatures.ts | 2 ++ .../tests/rules/unified-signatures.test.ts | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/packages/eslint-plugin/src/rules/unified-signatures.ts b/packages/eslint-plugin/src/rules/unified-signatures.ts index 9c255b6f9f50..d12e0b9001a6 100644 --- a/packages/eslint-plugin/src/rules/unified-signatures.ts +++ b/packages/eslint-plugin/src/rules/unified-signatures.ts @@ -601,6 +601,8 @@ function getOverloadKey(node: OverloadNode): string { const info = getOverloadInfo(node); return ( + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + ((node as MethodDefinition).kind || '') + ((node as MethodDefinition).computed ? '0' : '1') + ((node as MethodDefinition).static ? '0' : '1') + info diff --git a/packages/eslint-plugin/tests/rules/unified-signatures.test.ts b/packages/eslint-plugin/tests/rules/unified-signatures.test.ts index 0e5ee9219ce7..550e3548c32d 100644 --- a/packages/eslint-plugin/tests/rules/unified-signatures.test.ts +++ b/packages/eslint-plugin/tests/rules/unified-signatures.test.ts @@ -158,6 +158,18 @@ function rest(...xs: number[]): Promise; function rest(xs: number[], y: string): Promise; async function rest(...args: any[], y?: string): Promise { return y || args; +} + `, + ` +declare class Foo { + get bar(); + set bar(x: number); +} + `, + ` +interface Foo { + get bar(); + set bar(x: number); } `, { From 4c7084c467fbb13059bc2bdb57d688d9cd977529 Mon Sep 17 00:00:00 2001 From: YeonJuan Date: Sat, 15 Feb 2025 17:37:08 +0900 Subject: [PATCH 2/4] apply reviews --- .../src/rules/unified-signatures.ts | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/packages/eslint-plugin/src/rules/unified-signatures.ts b/packages/eslint-plugin/src/rules/unified-signatures.ts index d12e0b9001a6..439e21d8f5c3 100644 --- a/packages/eslint-plugin/src/rules/unified-signatures.ts +++ b/packages/eslint-plugin/src/rules/unified-signatures.ts @@ -1,4 +1,4 @@ -import type { TSESTree } from '@typescript-eslint/utils'; +import { TSESTree } from '@typescript-eslint/utils'; import { AST_NODE_TYPES } from '@typescript-eslint/utils'; @@ -558,12 +558,12 @@ export default createRule({ // collect overloads MethodDefinition(node): void { - if (!node.value.body) { + if (!node.value.body && !isGetterOrSetter(node)) { addOverload(node); } }, TSAbstractMethodDefinition(node): void { - if (!node.value.body) { + if (!node.value.body && !isGetterOrSetter(node)) { addOverload(node); } }, @@ -573,7 +573,11 @@ export default createRule({ const exportingNode = getExportingNode(node); addOverload(node, node.id?.name ?? exportingNode?.type, exportingNode); }, - TSMethodSignature: addOverload, + TSMethodSignature(node): void { + if (!isGetterOrSetter(node)) { + addOverload(node); + } + }, // validate scopes 'ClassDeclaration:exit': checkScope, @@ -601,8 +605,6 @@ function getOverloadKey(node: OverloadNode): string { const info = getOverloadInfo(node); return ( - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - ((node as MethodDefinition).kind || '') + ((node as MethodDefinition).computed ? '0' : '1') + ((node as MethodDefinition).static ? '0' : '1') + info @@ -636,3 +638,12 @@ function getStaticParameterName(param: TSESTree.Node): string | undefined { function isIdentifier(node: TSESTree.Node): node is TSESTree.Identifier { return node.type === AST_NODE_TYPES.Identifier; } + +function isGetterOrSetter(node: TSESTree.Node): boolean { + return ( + (node.type === AST_NODE_TYPES.MethodDefinition || + node.type === AST_NODE_TYPES.TSAbstractMethodDefinition || + node.type === AST_NODE_TYPES.TSMethodSignature) && + (node.kind === 'get' || node.kind === 'set') + ); +} From c0a9eeabaf71cdfcb144fa9a2f762ada6386f309 Mon Sep 17 00:00:00 2001 From: YeonJuan Date: Sat, 15 Feb 2025 17:41:12 +0900 Subject: [PATCH 3/4] apply reviews --- packages/eslint-plugin/src/rules/unified-signatures.ts | 2 +- .../eslint-plugin/tests/rules/unified-signatures.test.ts | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/rules/unified-signatures.ts b/packages/eslint-plugin/src/rules/unified-signatures.ts index 439e21d8f5c3..f2669699a675 100644 --- a/packages/eslint-plugin/src/rules/unified-signatures.ts +++ b/packages/eslint-plugin/src/rules/unified-signatures.ts @@ -1,4 +1,4 @@ -import { TSESTree } from '@typescript-eslint/utils'; +import type { TSESTree } from '@typescript-eslint/utils'; import { AST_NODE_TYPES } from '@typescript-eslint/utils'; diff --git a/packages/eslint-plugin/tests/rules/unified-signatures.test.ts b/packages/eslint-plugin/tests/rules/unified-signatures.test.ts index 550e3548c32d..f88ba1e89fd8 100644 --- a/packages/eslint-plugin/tests/rules/unified-signatures.test.ts +++ b/packages/eslint-plugin/tests/rules/unified-signatures.test.ts @@ -170,6 +170,12 @@ declare class Foo { interface Foo { get bar(); set bar(x: number); +} + `, + ` +abstract class Foo { + abstract get bar(); + abstract set bar(a: unknown); } `, { From 03a0daee475cc9a517520c7c1872628548e466e4 Mon Sep 17 00:00:00 2001 From: YeonJuan Date: Sun, 16 Feb 2025 00:47:09 +0900 Subject: [PATCH 4/4] Update unified-signatures.ts --- .../eslint-plugin/src/rules/unified-signatures.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/eslint-plugin/src/rules/unified-signatures.ts b/packages/eslint-plugin/src/rules/unified-signatures.ts index f2669699a675..af8bd281da51 100644 --- a/packages/eslint-plugin/src/rules/unified-signatures.ts +++ b/packages/eslint-plugin/src/rules/unified-signatures.ts @@ -639,11 +639,11 @@ function isIdentifier(node: TSESTree.Node): node is TSESTree.Identifier { return node.type === AST_NODE_TYPES.Identifier; } -function isGetterOrSetter(node: TSESTree.Node): boolean { - return ( - (node.type === AST_NODE_TYPES.MethodDefinition || - node.type === AST_NODE_TYPES.TSAbstractMethodDefinition || - node.type === AST_NODE_TYPES.TSMethodSignature) && - (node.kind === 'get' || node.kind === 'set') - ); +function isGetterOrSetter( + node: + | TSESTree.MethodDefinition + | TSESTree.TSAbstractMethodDefinition + | TSESTree.TSMethodSignature, +): boolean { + return node.kind === 'get' || node.kind === 'set'; }