From 7425409c5bd6e60448b7eaf0629e9bb59045ccfc Mon Sep 17 00:00:00 2001 From: Ronen Amiel Date: Fri, 20 Sep 2024 16:56:54 +0300 Subject: [PATCH 1/3] check type parameter on isBuiltinSymbolLikeRecurser --- packages/type-utils/src/builtinSymbolLikes.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/type-utils/src/builtinSymbolLikes.ts b/packages/type-utils/src/builtinSymbolLikes.ts index c1095be513a3..89dc0e1fc75c 100644 --- a/packages/type-utils/src/builtinSymbolLikes.ts +++ b/packages/type-utils/src/builtinSymbolLikes.ts @@ -158,6 +158,13 @@ export function isBuiltinSymbolLikeRecurser( isBuiltinSymbolLikeRecurser(program, t, predicate), ); } + if (type.isTypeParameter()) { + const t = type.getConstraint(); + + if (t) { + return isBuiltinSymbolLikeRecurser(program, t, predicate); + } + } const predicateResult = predicate(type); if (typeof predicateResult === 'boolean') { From 5f40ec567e9b5928f723da6eeebb5e5b56654da9 Mon Sep 17 00:00:00 2001 From: Ronen Amiel Date: Fri, 20 Sep 2024 17:05:51 +0300 Subject: [PATCH 2/3] basic tests --- .../tests/rules/only-throw-error.test.ts | 17 +++++++++++++ .../prefer-promise-reject-errors.test.ts | 24 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/packages/eslint-plugin/tests/rules/only-throw-error.test.ts b/packages/eslint-plugin/tests/rules/only-throw-error.test.ts index 0ae3f0e00769..a836485f8a8d 100644 --- a/packages/eslint-plugin/tests/rules/only-throw-error.test.ts +++ b/packages/eslint-plugin/tests/rules/only-throw-error.test.ts @@ -132,6 +132,11 @@ function fun(value: any) { ` function fun(value: unknown) { throw value; +} + `, + ` +function fun(t: T): void { + throw t; } `, ], @@ -468,5 +473,17 @@ function fun(value: unknown) { }, ], }, + { + code: ` +function fun(t: T): void { + throw t; +} + `, + errors: [ + { + messageId: 'object', + }, + ], + }, ], }); diff --git a/packages/eslint-plugin/tests/rules/prefer-promise-reject-errors.test.ts b/packages/eslint-plugin/tests/rules/prefer-promise-reject-errors.test.ts index e78575881255..c8981a31b3f0 100644 --- a/packages/eslint-plugin/tests/rules/prefer-promise-reject-errors.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-promise-reject-errors.test.ts @@ -275,6 +275,12 @@ ruleTester.run('prefer-promise-reject-errors', rule, { } } `, + ` + declare const foo: PromiseConstructor; + function fun(t: T): void { + foo.reject(t); + } + `, ], invalid: [ { @@ -1443,5 +1449,23 @@ Bar.reject(5); }, ], }, + { + code: ` +declare const foo: PromiseConstructor; +function fun(t: T): void { + foo.reject(t); +} + `, + errors: [ + { + messageId: 'rejectAnError', + type: AST_NODE_TYPES.CallExpression, + line: 4, + endLine: 4, + column: 3, + endColumn: 16, + }, + ], + }, ], }); From 3406cb7e64e8117ad52d3616830f8cc880550bb4 Mon Sep 17 00:00:00 2001 From: Ronen Amiel Date: Fri, 20 Sep 2024 17:57:40 +0300 Subject: [PATCH 3/3] use tsutils.isTypeParameter() instead of type.isTypeParameter() --- packages/type-utils/src/builtinSymbolLikes.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/type-utils/src/builtinSymbolLikes.ts b/packages/type-utils/src/builtinSymbolLikes.ts index 89dc0e1fc75c..7686531a40d3 100644 --- a/packages/type-utils/src/builtinSymbolLikes.ts +++ b/packages/type-utils/src/builtinSymbolLikes.ts @@ -1,3 +1,4 @@ +import * as tsutils from 'ts-api-utils'; import * as ts from 'typescript'; import { isSymbolFromDefaultLibrary } from './isSymbolFromDefaultLibrary'; @@ -158,12 +159,15 @@ export function isBuiltinSymbolLikeRecurser( isBuiltinSymbolLikeRecurser(program, t, predicate), ); } - if (type.isTypeParameter()) { + // https://github.com/JoshuaKGoldberg/ts-api-utils/issues/382 + if ((tsutils.isTypeParameter as (type: ts.Type) => boolean)(type)) { const t = type.getConstraint(); if (t) { return isBuiltinSymbolLikeRecurser(program, t, predicate); } + + return false; } const predicateResult = predicate(type);