-
-
Notifications
You must be signed in to change notification settings - Fork 2.9k
fix(eslint-plugin): honor ignored base types on generic classes #11767
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix(eslint-plugin): honor ignored base types on generic classes #11767
Conversation
|
Thanks for the PR, @OleksandraKordonets! typescript-eslint is a 100% community driven project, and we are incredibly grateful that you are contributing to that community. The core maintainers work on this in their personal time, so please understand that it may not be possible for them to review your work immediately. Thanks again! 🙏 Please, if you or your company is finding typescript-eslint valuable, help us sustain the project by sponsoring it transparently on https://opencollective.com/typescript-eslint. |
✅ Deploy Preview for typescript-eslint ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
View your CI Pipeline Execution ↗ for commit 52a4d74
☁️ Nx Cloud last updated this comment at |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #11767 +/- ##
=======================================
Coverage 90.49% 90.49%
=======================================
Files 522 522
Lines 53357 53362 +5
Branches 8909 8914 +5
=======================================
+ Hits 48284 48289 +5
Misses 5057 5057
Partials 16 16
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
JoshuaKGoldberg
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks! ✨
I just left a couple of stylistic nitpicks in case you're interested. No worries at all if you prefer the code as-is, I just like refactoring as a form of reading the code. Totally up to you. 🙂
| if (ignoredTypeNames.includes(typeName)) { | ||
| return true; | ||
| } | ||
|
|
||
| return getBaseTypesForType(type).some(base => | ||
| isIgnoredTypeOrBase(base, seen), | ||
| ); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[Style] If you want to save a few lines 😄
| if (ignoredTypeNames.includes(typeName)) { | |
| return true; | |
| } | |
| return getBaseTypesForType(type).some(base => | |
| isIgnoredTypeOrBase(base, seen), | |
| ); | |
| return ( | |
| ignoredTypeNames.includes(getTypeName(checker, type)) || | |
| getBaseTypesForType(type).some(base => isIgnoredTypeOrBase(base, seen)) | |
| ); |
Btw, I wouldn't recommend sending PRs for issues that aren't yet marked as accepting prs. In this case it worked out because the issue was straightforward and accepted. But we've previously had to close PRs where the author put in a lot of work but the issue wasn't actually something that could be accepted. That feels bad for everyone. |
JoshuaKGoldberg
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks! 🙌
| datasource | package | from | to | | ---------- | -------------------------------- | ------ | ------ | | npm | @typescript-eslint/eslint-plugin | 8.48.0 | 8.48.1 | | npm | @typescript-eslint/parser | 8.48.0 | 8.48.1 | ## [v8.48.1](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8481-2025-12-02) ##### 🩹 Fixes - **eslint-plugin:** \[restrict-template-expressions] check base types in allow list ([#11764](typescript-eslint/typescript-eslint#11764), [#11759](typescript-eslint/typescript-eslint#11759)) - **eslint-plugin:** honor ignored base types on generic classes ([#11767](typescript-eslint/typescript-eslint#11767)) - **eslint-plugin:** \[consistent-type-exports] check value flag before resolving alias ([#11769](typescript-eslint/typescript-eslint#11769)) ##### ❤️ Thank You - Josh Goldberg - OleksandraKordonets - SangheeSon [@Higangssh](https://github.com/Higangssh) - tao You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.
| datasource | package | from | to | | ---------- | -------------------------------- | ------ | ------ | | npm | @typescript-eslint/eslint-plugin | 8.48.0 | 8.48.1 | | npm | @typescript-eslint/parser | 8.48.0 | 8.48.1 | ## [v8.48.1](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8481-2025-12-02) ##### 🩹 Fixes - **eslint-plugin:** \[restrict-template-expressions] check base types in allow list ([#11764](typescript-eslint/typescript-eslint#11764), [#11759](typescript-eslint/typescript-eslint#11759)) - **eslint-plugin:** honor ignored base types on generic classes ([#11767](typescript-eslint/typescript-eslint#11767)) - **eslint-plugin:** \[consistent-type-exports] check value flag before resolving alias ([#11769](typescript-eslint/typescript-eslint#11769)) ##### ❤️ Thank You - Josh Goldberg - OleksandraKordonets - SangheeSon [@Higangssh](https://github.com/Higangssh) - tao You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.
This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [@typescript-eslint/eslint-plugin](https://typescript-eslint.io/packages/eslint-plugin) ([source](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin)) | [`8.47.0` -> `8.48.1`](https://renovatebot.com/diffs/npm/@typescript-eslint%2feslint-plugin/8.47.0/8.48.1) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | | [@typescript-eslint/parser](https://typescript-eslint.io/packages/parser) ([source](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)) | [`8.47.0` -> `8.48.1`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.47.0/8.48.1) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/eslint-plugin)</summary> ### [`v8.48.1`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8481-2025-12-02) [Compare Source](typescript-eslint/typescript-eslint@v8.48.0...v8.48.1) ##### 🩹 Fixes - **eslint-plugin:** \[restrict-template-expressions] check base types in allow list ([#​11764](typescript-eslint/typescript-eslint#11764), [#​11759](typescript-eslint/typescript-eslint#11759)) - **eslint-plugin:** honor ignored base types on generic classes ([#​11767](typescript-eslint/typescript-eslint#11767)) - **eslint-plugin:** \[consistent-type-exports] check value flag before resolving alias ([#​11769](typescript-eslint/typescript-eslint#11769)) ##### ❤️ Thank You - Josh Goldberg - OleksandraKordonets - SangheeSon [@​Higangssh](https://github.com/Higangssh) - tao You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. ### [`v8.48.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8480-2025-11-24) [Compare Source](typescript-eslint/typescript-eslint@v8.47.0...v8.48.0) ##### 🚀 Features - **eslint-plugin:** \[no-redundant-type-constituents] use assignability checking for redundancy checks ([#​10744](typescript-eslint/typescript-eslint#10744)) ##### 🩹 Fixes - **typescript-estree:** disallow binding patterns in parameter properties ([#​11760](typescript-eslint/typescript-eslint#11760)) - **eslint-plugin:** \[consistent-generic-constructors] ignore when constructor is typed array ([#​10477](typescript-eslint/typescript-eslint#10477)) ##### ❤️ Thank You - Dima Barabash [@​dbarabashh](https://github.com/dbarabashh) - JamesHenry [@​JamesHenry](https://github.com/JamesHenry) - Josh Goldberg - mdm317 [@​gen-ip-1](https://github.com/gen-ip-1) You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/parser)</summary> ### [`v8.48.1`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8481-2025-12-02) [Compare Source](typescript-eslint/typescript-eslint@v8.48.0...v8.48.1) This was a version bump only for parser to align it with other projects, there were no code changes. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. ### [`v8.48.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8480-2025-11-24) [Compare Source](typescript-eslint/typescript-eslint@v8.47.0...v8.48.0) This was a version bump only for parser to align it with other projects, there were no code changes. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi4xNC4yIiwidXBkYXRlZEluVmVyIjoiNDIuMTQuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==--> Reviewed-on: https://git.csmpro.ru/csmpro/mapban/pulls/57 Co-authored-by: Renovate Bot <renovate@csmpro.ru> Co-committed-by: Renovate Bot <renovate@csmpro.ru>
| datasource | package | from | to | | ---------- | -------------------------------- | ------ | ------ | | npm | @typescript-eslint/eslint-plugin | 8.48.0 | 8.48.1 | | npm | @typescript-eslint/parser | 8.48.0 | 8.48.1 | ## [v8.48.1](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8481-2025-12-02) ##### 🩹 Fixes - **eslint-plugin:** \[restrict-template-expressions] check base types in allow list ([#11764](typescript-eslint/typescript-eslint#11764), [#11759](typescript-eslint/typescript-eslint#11759)) - **eslint-plugin:** honor ignored base types on generic classes ([#11767](typescript-eslint/typescript-eslint#11767)) - **eslint-plugin:** \[consistent-type-exports] check value flag before resolving alias ([#11769](typescript-eslint/typescript-eslint#11769)) ##### ❤️ Thank You - Josh Goldberg - OleksandraKordonets - SangheeSon [@Higangssh](https://github.com/Higangssh) - tao You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.
| datasource | package | from | to | | ---------- | -------------------------------- | ------ | ------ | | npm | @typescript-eslint/eslint-plugin | 8.48.0 | 8.48.1 | | npm | @typescript-eslint/parser | 8.48.0 | 8.48.1 | ## [v8.48.1](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8481-2025-12-02) ##### 🩹 Fixes - **eslint-plugin:** \[restrict-template-expressions] check base types in allow list ([#11764](typescript-eslint/typescript-eslint#11764), [#11759](typescript-eslint/typescript-eslint#11759)) - **eslint-plugin:** honor ignored base types on generic classes ([#11767](typescript-eslint/typescript-eslint#11767)) - **eslint-plugin:** \[consistent-type-exports] check value flag before resolving alias ([#11769](typescript-eslint/typescript-eslint#11769)) ##### ❤️ Thank You - Josh Goldberg - OleksandraKordonets - SangheeSon [@Higangssh](https://github.com/Higangssh) - tao You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.
| datasource | package | from | to | | ---------- | -------------------------------- | ------ | ------ | | npm | @typescript-eslint/eslint-plugin | 8.48.0 | 8.48.1 | | npm | @typescript-eslint/parser | 8.48.0 | 8.48.1 | ## [v8.48.1](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8481-2025-12-02) ##### 🩹 Fixes - **eslint-plugin:** \[restrict-template-expressions] check base types in allow list ([#11764](typescript-eslint/typescript-eslint#11764), [#11759](typescript-eslint/typescript-eslint#11759)) - **eslint-plugin:** honor ignored base types on generic classes ([#11767](typescript-eslint/typescript-eslint#11767)) - **eslint-plugin:** \[consistent-type-exports] check value flag before resolving alias ([#11769](typescript-eslint/typescript-eslint#11769)) ##### ❤️ Thank You - Josh Goldberg - OleksandraKordonets - SangheeSon [@Higangssh](https://github.com/Higangssh) - tao You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.

PR Checklist
Overview
This PR fixes a false positive in
@typescript-eslint/no-base-to-stringwhere.toString()calls on values typed as generic subclasses of ignored types, such asError, were being incorrectly reported. The rule previously only checked the type’s direct name, causing cases likeclass Boom<T> extends Error {}to be treated as unsafe, so this update adds recursive base-type checking with cycle protection to ensure that if a type or any of its ancestors matchignoredTypeNames, the call is allowed. A test is included to confirm.toString()is not reported for both direct and chained generic subclasses ofError, while preserving all existing rule behavior and configuration.