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, + }, + ], + }, ], }); diff --git a/packages/type-utils/src/builtinSymbolLikes.ts b/packages/type-utils/src/builtinSymbolLikes.ts index c1095be513a3..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,6 +159,16 @@ export function isBuiltinSymbolLikeRecurser( isBuiltinSymbolLikeRecurser(program, t, predicate), ); } + // 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); if (typeof predicateResult === 'boolean') {