From 4289adb5a0ea8d3500680f382174e4efbe599e82 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Tue, 6 Aug 2024 15:49:59 -0400 Subject: [PATCH 1/3] fix(eslint-plugin): [no-unnecessary-type-parameters] check mapped alias type arguments --- .../rules/no-unnecessary-type-parameters.ts | 1 + .../no-unnecessary-type-parameters.test.ts | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/packages/eslint-plugin/src/rules/no-unnecessary-type-parameters.ts b/packages/eslint-plugin/src/rules/no-unnecessary-type-parameters.ts index f191efa2f4e7..77cb6f931962 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-type-parameters.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-type-parameters.ts @@ -265,6 +265,7 @@ function collectTypeParameterUsageCounts( else if (tsutils.isConditionalType(type)) { visitType(type.checkType, assumeMultipleUses); visitType(type.extendsType, assumeMultipleUses); + type.aliasTypeArguments?.forEach(typeArgument => visitType(typeArgument, false)); } // Catch-all: inferred object types like `{ K: V }`. diff --git a/packages/eslint-plugin/tests/rules/no-unnecessary-type-parameters.test.ts b/packages/eslint-plugin/tests/rules/no-unnecessary-type-parameters.test.ts index e5a7558e2f49..64bbece72f2f 100644 --- a/packages/eslint-plugin/tests/rules/no-unnecessary-type-parameters.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unnecessary-type-parameters.test.ts @@ -342,6 +342,24 @@ ruleTester.run('no-unnecessary-type-parameters', rule, { (token): token is Exclude => tokenType in conditions; `, + ` + type Foo = S extends 'somebody' + ? T extends 'once' + ? 'told' + : 'me' + : never; + + declare function foo(data: T): (other: S) => Foo; + `, + ` + type Foo = S extends 'somebody' + ? T extends 'once' + ? 'told' + : 'me' + : never; + + declare function foo(data: T): (other: S) => Foo; + `, ` declare function mapObj( obj: { [key in K]?: V }, From 469e9337e519c80916a472108c2526734d86227f Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Mon, 12 Aug 2024 15:32:46 -0400 Subject: [PATCH 2/3] yarn format --write --- .../eslint-plugin/src/rules/no-unnecessary-type-parameters.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/rules/no-unnecessary-type-parameters.ts b/packages/eslint-plugin/src/rules/no-unnecessary-type-parameters.ts index 0ce98d4395bd..ebee4ef0015e 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-type-parameters.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-type-parameters.ts @@ -288,7 +288,9 @@ function collectTypeParameterUsageCounts( else if (tsutils.isConditionalType(type)) { visitType(type.checkType, assumeMultipleUses); visitType(type.extendsType, assumeMultipleUses); - type.aliasTypeArguments?.forEach(typeArgument => visitType(typeArgument, false)); + type.aliasTypeArguments?.forEach(typeArgument => + visitType(typeArgument, false), + ); } // Catch-all: inferred object types like `{ K: V }`. From cc6563cf418a1c51b69db14664e873eed666a61b Mon Sep 17 00:00:00 2001 From: Dan Vanderkam Date: Mon, 19 Aug 2024 12:29:57 -0400 Subject: [PATCH 3/3] Handle type aliases higher up in #9741 (#323) handle type aliases higher up --- .../rules/no-unnecessary-type-parameters.ts | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-unnecessary-type-parameters.ts b/packages/eslint-plugin/src/rules/no-unnecessary-type-parameters.ts index ebee4ef0015e..6b74879b0dfe 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-type-parameters.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-type-parameters.ts @@ -258,6 +258,13 @@ function collectTypeParameterUsageCounts( } } + // Catch-all: generic type references like `Exclude` + else if (type.aliasTypeArguments) { + // We don't descend into the definition of the type alias, so we don't + // know whether it's used multiple times. It's safest to assume it is. + visitTypesList(type.aliasTypeArguments, true); + } + // Intersections and unions like `0 | 1` else if (tsutils.isUnionOrIntersectionType(type)) { visitTypesList(type.types, assumeMultipleUses); @@ -288,9 +295,6 @@ function collectTypeParameterUsageCounts( else if (tsutils.isConditionalType(type)) { visitType(type.checkType, assumeMultipleUses); visitType(type.extendsType, assumeMultipleUses); - type.aliasTypeArguments?.forEach(typeArgument => - visitType(typeArgument, false), - ); } // Catch-all: inferred object types like `{ K: V }`. @@ -310,10 +314,6 @@ function collectTypeParameterUsageCounts( } } - for (const typeArgument of type.aliasTypeArguments ?? []) { - visitType(typeArgument, true); - } - visitType(type.getNumberIndexType(), true); visitType(type.getStringIndexType(), true); @@ -332,11 +332,6 @@ function collectTypeParameterUsageCounts( else if (isOperatorType(type)) { visitType(type.type, assumeMultipleUses); } - - // Catch-all: generic type references like `Exclude` - else if (type.aliasTypeArguments) { - visitTypesList(type.aliasTypeArguments, true); - } } function incrementIdentifierCount( pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy