Skip to content

fix(eslint-plugin): [unbound-method] treat Intl.Collator.prototype.compare as spec-bound - #12845

Merged
bradzacher merged 2 commits into
typescript-eslint:mainfrom
shinji00222:fix/unbound-method-intl-collator-compare
Sep 15, 2026
Merged

bradzacher merged 2 commits into
typescript-eslint:mainfrom
shinji00222:fix/unbound-method-intl-collator-compare

Conversation

@shinji00222

Copy link
Copy Markdown
Contributor

PR Checklist

Overview

Intl.Collator.prototype.compare is defined by the ECMA-402 spec as a bound getter function, so usages like array.sort(collator.compare) are safe. The TypeScript lib declarations (lib.es5.d.ts) don't model that binding and declare compare as a regular method, so unbound-method incorrectly flags these usages.

This PR adds a small allowlist of spec-bound instance methods on built-in classes (Collator.compare for now), guarded by the default-library checks already used in this rule, and consults it in isNativelyBound.

Verified locally: the two new valid cases fail without the change (the reported false positive) and pass with it; new invalid cases confirm resolvedOptions, user-defined compare methods, and user-defined classes named Collator are still reported. Full unbound-method test file passes (216 tests).

💖

@typescript-eslint

Copy link
Copy Markdown
Contributor

Thanks for the PR, @shinji00222!

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.

@netlify

netlify Bot commented Sep 8, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for typescript-eslint ready!

Name Link
🔨 Latest commit dbab3ba
🔍 Latest deploy log https://app.netlify.com/projects/typescript-eslint/deploys/6aa8c4ca947a4f0008192a86
😎 Deploy Preview https://deploy-preview-12845--typescript-eslint.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
Lighthouse
Lighthouse
1 paths audited
Performance: 88 (🔴 down 11 from production)
Accessibility: 97 (no change from production)
Best Practices: 100 (no change from production)
SEO: 90 (no change from production)
PWA: 80 (no change from production)
View the detailed breakdown and full score reports
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@github-actions github-actions Bot added bug Something isn't working package: eslint-plugin Issues related to @typescript-eslint/eslint-plugin labels Sep 8, 2026
@nx-cloud

nx-cloud Bot commented Sep 8, 2026 •

Copy link
Copy Markdown

View your CI Pipeline Execution ↗ for commit dbab3ba

Command Status Duration Result
nx run-many -t lint --projects=typescript-estre... ✅ Succeeded 51s View ↗
nx run-many -t lint --projects=eslint-plugin --... ✅ Succeeded 1m View ↗
nx run-many -t typecheck ✅ Succeeded 59s View ↗
nx run-many -t typecheck:tsgo ✅ Succeeded 38s View ↗
nx run-many -t lint --projects=parser,type-util... ✅ Succeeded 26s View ↗
nx run-many -t lint --projects=ast-spec,utils,s... ✅ Succeeded 25s View ↗
nx run integration-tests:test ✅ Succeeded 6s View ↗
nx run types:build ✅ Succeeded 1s View ↗
Additional runs (16) ✅ Succeeded ... View ↗

☁️ Nx Cloud last updated this comment at 2026-09-15 04:13:38 UTC

@codecov

codecov Bot commented Sep 8, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 94.99%. Comparing base (b6b86a1) to head (dbab3ba).
⚠️ Report is 24 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main   #12845      +/-   ##
==========================================
+ Coverage   90.56%   94.99%   +4.43%     
==========================================
  Files         523      229     -294     
  Lines       17058    11643    -5415     
  Branches     5293     3870    -1423     
==========================================
- Hits        15448    11060    -4388     
+ Misses        960      251     -709     
+ Partials      650      332     -318     
Flag Coverage Δ
unittest 94.99% <100.00%> (+4.43%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
packages/eslint-plugin/src/rules/unbound-method.ts 96.69% <100.00%> (+0.26%) ⬆️

... and 310 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@bradzacher bradzacher left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

almost there!

Comment on lines +99 to +102
const SPEC_BOUND_INSTANCE_METHODS: ReadonlyMap<
string,
ReadonlySet<string>
> = new Map([['Collator', new Set(['compare'])]]);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to mirror the existing setup for nativelyBoundMembers -- let's make this a Set<string> eg

const nativelyBoundInstanceMethods = new Set([
  'Collator.compare',
]);

and update isSpecBoundBuiltinMethod as appropriate

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in dbab3ba. Thanks!

@github-actions github-actions Bot added the awaiting response Issues waiting for a reply from the OP or another party label Sep 14, 2026
@bradzacher
bradzacher self-requested a review September 15, 2026 17:01
@github-actions github-actions Bot removed the awaiting response Issues waiting for a reply from the OP or another party label Sep 15, 2026

@bradzacher bradzacher left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bradzacher
bradzacher merged commit b1993df into typescript-eslint:main Sep 15, 2026
43 of 45 checks passed
@github-actions github-actions Bot added the 1 approval >=1 team member has approved this PR; we're now leaving it open for more reviews before we merge label Sep 15, 2026
graphite-app Bot pushed a commit to oxc-project/tsgolint that referenced this pull request Sep 23, 2026
Port typescript-eslint/typescript-eslint#12845. Allow passing `collator.compare` as a callback or extracting it through destructuring: ECMA-402 binds this function to its instance, although TypeScript declares it as an ordinary method.

Require the resolved method to come from the default-library `Collator` declaration, including inherited getters but excluding subclass overrides. Apply the same check to typed and defaulted destructuring bindings. Include all five upstream regression cases and additional coverage for those binding and inheritance forms, while preserving diagnostics for `resolvedOptions` and user-defined methods.
renovate Bot added a commit to andrei-picus-tink/auto-renovate that referenced this pull request Oct 2, 2026
| datasource | package                          | from   | to     |
| ---------- | -------------------------------- | ------ | ------ |
| npm        | @typescript-eslint/eslint-plugin | 8.69.0 | 8.71.0 |
| npm        | @typescript-eslint/parser        | 8.69.0 | 8.71.0 |


## [v8.71.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8710-2026-09-28)

##### 🚀 Features

- **eslint-plugin:** \[no-unsafe-enum-assignment] add rule ([#12732](typescript-eslint/typescript-eslint#12732))

##### 🩹 Fixes

- **eslint-plugin:** \[no-misused-promises] handle a return outside of any function ([#12912](typescript-eslint/typescript-eslint#12912))
- **eslint-plugin:** \[no-unnecessary-type-assertion] specialize generic assertion report message ([#12832](typescript-eslint/typescript-eslint#12832))
- **eslint-plugin:** \[unbound-method] respect `this: void` on class properties ([7fce9127d](typescript-eslint/typescript-eslint@7fce9127d))
- **eslint-plugin:** \[switch-exhaustiveness-check] always sort literal cases in stable order ([#12885](typescript-eslint/typescript-eslint#12885))

##### ❤️ Thank You

- Evyatar Daud [@StyleShit](https://github.com/StyleShit)
- Fatih Çakır [@wfatih](https://github.com/wfatih)
- Josh Goldberg
- Josh Goldberg ✨
- Zamiell [@Zamiell](https://github.com/Zamiell)

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.71.0) for more information.

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.70.1](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8701-2026-09-21)

##### 🩹 Fixes

- **eslint-plugin:** \[no-misused-promises] handle multiple Promise constituents ([#12904](typescript-eslint/typescript-eslint#12904))
- **eslint-plugin:** \[no-useless-default-assignment] convert the fixer to a suggestion fixer ([#12826](typescript-eslint/typescript-eslint#12826))
- **eslint-plugin:** \[no-unnecessary-condition] handle union-keyed index access on the left-hand side of nullish assignment ([#12747](typescript-eslint/typescript-eslint#12747))
- **eslint-plugin:** \[unbound-method] treat Intl.Collator.prototype.compare as spec-bound ([#12845](typescript-eslint/typescript-eslint#12845))
- **eslint-plugin:** \[no-unnecessary-parameter-property-assignment] account for parameter reassignment ([#12880](typescript-eslint/typescript-eslint#12880))
- **eslint-plugin:** \[await-thenable] prevent autofix from breaking code when removing `await` ([#12716](typescript-eslint/typescript-eslint#12716))
- **eslint-plugin:** \[no-meaningless-void-operator] allow void on assignment expressions ([#12873](typescript-eslint/typescript-eslint#12873))
- **eslint-plugin:** \[no-unnecessary-type-assertion] false positive for empty object asserted to a type alias of Record ([#12869](typescript-eslint/typescript-eslint#12869))
- **eslint-plugin:** \[no-misused-spread] omit WeakMap spread suggestions ([#12850](typescript-eslint/typescript-eslint#12850))
- **eslint-plugin:** \[no-generated-empty-object-type] don't report a mapped type whose keys are not resolved yet ([#12854](typescript-eslint/typescript-eslint#12854))
- **eslint-plugin:** \[no-explicit-any] use unknown\[] for bare any rest parameters ([#12818](typescript-eslint/typescript-eslint#12818))
- **eslint-plugin:** \[no-unnecessary-type-parameters] handle type precedence in the suggestion fixer ([#12637](typescript-eslint/typescript-eslint#12637))
- **eslint-plugin:** \[no-useless-default-assignment] avoid false positives on tuples with a rest element ([#12768](typescript-eslint/typescript-eslint#12768))

##### ❤️ Thank You

- Brad Zacher [@bradzacher](https://github.com/bradzacher)
- Diptajoy Mistry [@diptomistry](https://github.com/diptomistry)
- Grit [@Grit03](https://github.com/Grit03)
- Hugo [@hugop95](https://github.com/hugop95)
- Michael Naumov [@mnaoumov](https://github.com/mnaoumov)
- Mikhail Baev [@baevm](https://github.com/baevm)
- Om Rawat
- Sanath [@sansynx](https://github.com/sansynx)
- Shinji
- Vinccool96
- 김채영 [@cchaeyoung](https://github.com/cchaeyoung)
- 송재욱

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.70.1) for more information.

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.70.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8700-2026-09-07)

##### 🚀 Features

- **eslint-plugin:** \[no-generated-empty-object-type] add rule ([#12730](typescript-eslint/typescript-eslint#12730))

##### 🩹 Fixes

- **eslint-plugin:** \[no-deprecated] report deprecated imported values used in object shorthand properties ([#12780](typescript-eslint/typescript-eslint#12780))
- **eslint-plugin:** \[no-unnecessary-condition] no false positive on RHS of a nested logical expression ([#12728](typescript-eslint/typescript-eslint#12728))
- **eslint-plugin:** \[member-ordering] don't report fields that read fields declared before them ([#12729](typescript-eslint/typescript-eslint#12729))

##### ❤️ Thank You

- Josh Goldberg ✨ [@JoshuaKGoldberg](https://github.com/JoshuaKGoldberg)
- Ulrich Stark [@ulrichstark](https://github.com/ulrichstark)

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.70.0) for more information.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.
renovate Bot added a commit to andrei-picus-tink/auto-renovate that referenced this pull request Oct 2, 2026
| datasource | package                          | from   | to     |
| ---------- | -------------------------------- | ------ | ------ |
| npm        | @typescript-eslint/eslint-plugin | 8.69.0 | 8.71.0 |
| npm        | @typescript-eslint/parser        | 8.69.0 | 8.71.0 |


## [v8.71.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8710-2026-09-28)

##### 🚀 Features

- **eslint-plugin:** \[no-unsafe-enum-assignment] add rule ([#12732](typescript-eslint/typescript-eslint#12732))

##### 🩹 Fixes

- **eslint-plugin:** \[no-misused-promises] handle a return outside of any function ([#12912](typescript-eslint/typescript-eslint#12912))
- **eslint-plugin:** \[no-unnecessary-type-assertion] specialize generic assertion report message ([#12832](typescript-eslint/typescript-eslint#12832))
- **eslint-plugin:** \[unbound-method] respect `this: void` on class properties ([7fce9127d](typescript-eslint/typescript-eslint@7fce9127d))
- **eslint-plugin:** \[switch-exhaustiveness-check] always sort literal cases in stable order ([#12885](typescript-eslint/typescript-eslint#12885))

##### ❤️ Thank You

- Evyatar Daud [@StyleShit](https://github.com/StyleShit)
- Fatih Çakır [@wfatih](https://github.com/wfatih)
- Josh Goldberg
- Josh Goldberg ✨
- Zamiell [@Zamiell](https://github.com/Zamiell)

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.71.0) for more information.

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.70.1](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8701-2026-09-21)

##### 🩹 Fixes

- **eslint-plugin:** \[no-misused-promises] handle multiple Promise constituents ([#12904](typescript-eslint/typescript-eslint#12904))
- **eslint-plugin:** \[no-useless-default-assignment] convert the fixer to a suggestion fixer ([#12826](typescript-eslint/typescript-eslint#12826))
- **eslint-plugin:** \[no-unnecessary-condition] handle union-keyed index access on the left-hand side of nullish assignment ([#12747](typescript-eslint/typescript-eslint#12747))
- **eslint-plugin:** \[unbound-method] treat Intl.Collator.prototype.compare as spec-bound ([#12845](typescript-eslint/typescript-eslint#12845))
- **eslint-plugin:** \[no-unnecessary-parameter-property-assignment] account for parameter reassignment ([#12880](typescript-eslint/typescript-eslint#12880))
- **eslint-plugin:** \[await-thenable] prevent autofix from breaking code when removing `await` ([#12716](typescript-eslint/typescript-eslint#12716))
- **eslint-plugin:** \[no-meaningless-void-operator] allow void on assignment expressions ([#12873](typescript-eslint/typescript-eslint#12873))
- **eslint-plugin:** \[no-unnecessary-type-assertion] false positive for empty object asserted to a type alias of Record ([#12869](typescript-eslint/typescript-eslint#12869))
- **eslint-plugin:** \[no-misused-spread] omit WeakMap spread suggestions ([#12850](typescript-eslint/typescript-eslint#12850))
- **eslint-plugin:** \[no-generated-empty-object-type] don't report a mapped type whose keys are not resolved yet ([#12854](typescript-eslint/typescript-eslint#12854))
- **eslint-plugin:** \[no-explicit-any] use unknown\[] for bare any rest parameters ([#12818](typescript-eslint/typescript-eslint#12818))
- **eslint-plugin:** \[no-unnecessary-type-parameters] handle type precedence in the suggestion fixer ([#12637](typescript-eslint/typescript-eslint#12637))
- **eslint-plugin:** \[no-useless-default-assignment] avoid false positives on tuples with a rest element ([#12768](typescript-eslint/typescript-eslint#12768))

##### ❤️ Thank You

- Brad Zacher [@bradzacher](https://github.com/bradzacher)
- Diptajoy Mistry [@diptomistry](https://github.com/diptomistry)
- Grit [@Grit03](https://github.com/Grit03)
- Hugo [@hugop95](https://github.com/hugop95)
- Michael Naumov [@mnaoumov](https://github.com/mnaoumov)
- Mikhail Baev [@baevm](https://github.com/baevm)
- Om Rawat
- Sanath [@sansynx](https://github.com/sansynx)
- Shinji
- Vinccool96
- 김채영 [@cchaeyoung](https://github.com/cchaeyoung)
- 송재욱

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.70.1) for more information.

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.70.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8700-2026-09-07)

##### 🚀 Features

- **eslint-plugin:** \[no-generated-empty-object-type] add rule ([#12730](typescript-eslint/typescript-eslint#12730))

##### 🩹 Fixes

- **eslint-plugin:** \[no-deprecated] report deprecated imported values used in object shorthand properties ([#12780](typescript-eslint/typescript-eslint#12780))
- **eslint-plugin:** \[no-unnecessary-condition] no false positive on RHS of a nested logical expression ([#12728](typescript-eslint/typescript-eslint#12728))
- **eslint-plugin:** \[member-ordering] don't report fields that read fields declared before them ([#12729](typescript-eslint/typescript-eslint#12729))

##### ❤️ Thank You

- Josh Goldberg ✨ [@JoshuaKGoldberg](https://github.com/JoshuaKGoldberg)
- Ulrich Stark [@ulrichstark](https://github.com/ulrichstark)

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.70.0) for more information.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.
renovate Bot added a commit to andrei-picus-tink/auto-renovate that referenced this pull request Oct 3, 2026
| datasource | package                          | from   | to     |
| ---------- | -------------------------------- | ------ | ------ |
| npm        | @typescript-eslint/eslint-plugin | 8.69.0 | 8.71.0 |
| npm        | @typescript-eslint/parser        | 8.69.0 | 8.71.0 |


## [v8.71.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8710-2026-09-28)

##### 🚀 Features

- **eslint-plugin:** \[no-unsafe-enum-assignment] add rule ([#12732](typescript-eslint/typescript-eslint#12732))

##### 🩹 Fixes

- **eslint-plugin:** \[no-misused-promises] handle a return outside of any function ([#12912](typescript-eslint/typescript-eslint#12912))
- **eslint-plugin:** \[no-unnecessary-type-assertion] specialize generic assertion report message ([#12832](typescript-eslint/typescript-eslint#12832))
- **eslint-plugin:** \[unbound-method] respect `this: void` on class properties ([7fce9127d](typescript-eslint/typescript-eslint@7fce9127d))
- **eslint-plugin:** \[switch-exhaustiveness-check] always sort literal cases in stable order ([#12885](typescript-eslint/typescript-eslint#12885))

##### ❤️ Thank You

- Evyatar Daud [@StyleShit](https://github.com/StyleShit)
- Fatih Çakır [@wfatih](https://github.com/wfatih)
- Josh Goldberg
- Josh Goldberg ✨
- Zamiell [@Zamiell](https://github.com/Zamiell)

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.71.0) for more information.

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.70.1](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8701-2026-09-21)

##### 🩹 Fixes

- **eslint-plugin:** \[no-misused-promises] handle multiple Promise constituents ([#12904](typescript-eslint/typescript-eslint#12904))
- **eslint-plugin:** \[no-useless-default-assignment] convert the fixer to a suggestion fixer ([#12826](typescript-eslint/typescript-eslint#12826))
- **eslint-plugin:** \[no-unnecessary-condition] handle union-keyed index access on the left-hand side of nullish assignment ([#12747](typescript-eslint/typescript-eslint#12747))
- **eslint-plugin:** \[unbound-method] treat Intl.Collator.prototype.compare as spec-bound ([#12845](typescript-eslint/typescript-eslint#12845))
- **eslint-plugin:** \[no-unnecessary-parameter-property-assignment] account for parameter reassignment ([#12880](typescript-eslint/typescript-eslint#12880))
- **eslint-plugin:** \[await-thenable] prevent autofix from breaking code when removing `await` ([#12716](typescript-eslint/typescript-eslint#12716))
- **eslint-plugin:** \[no-meaningless-void-operator] allow void on assignment expressions ([#12873](typescript-eslint/typescript-eslint#12873))
- **eslint-plugin:** \[no-unnecessary-type-assertion] false positive for empty object asserted to a type alias of Record ([#12869](typescript-eslint/typescript-eslint#12869))
- **eslint-plugin:** \[no-misused-spread] omit WeakMap spread suggestions ([#12850](typescript-eslint/typescript-eslint#12850))
- **eslint-plugin:** \[no-generated-empty-object-type] don't report a mapped type whose keys are not resolved yet ([#12854](typescript-eslint/typescript-eslint#12854))
- **eslint-plugin:** \[no-explicit-any] use unknown\[] for bare any rest parameters ([#12818](typescript-eslint/typescript-eslint#12818))
- **eslint-plugin:** \[no-unnecessary-type-parameters] handle type precedence in the suggestion fixer ([#12637](typescript-eslint/typescript-eslint#12637))
- **eslint-plugin:** \[no-useless-default-assignment] avoid false positives on tuples with a rest element ([#12768](typescript-eslint/typescript-eslint#12768))

##### ❤️ Thank You

- Brad Zacher [@bradzacher](https://github.com/bradzacher)
- Diptajoy Mistry [@diptomistry](https://github.com/diptomistry)
- Grit [@Grit03](https://github.com/Grit03)
- Hugo [@hugop95](https://github.com/hugop95)
- Michael Naumov [@mnaoumov](https://github.com/mnaoumov)
- Mikhail Baev [@baevm](https://github.com/baevm)
- Om Rawat
- Sanath [@sansynx](https://github.com/sansynx)
- Shinji
- Vinccool96
- 김채영 [@cchaeyoung](https://github.com/cchaeyoung)
- 송재욱

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.70.1) for more information.

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.70.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8700-2026-09-07)

##### 🚀 Features

- **eslint-plugin:** \[no-generated-empty-object-type] add rule ([#12730](typescript-eslint/typescript-eslint#12730))

##### 🩹 Fixes

- **eslint-plugin:** \[no-deprecated] report deprecated imported values used in object shorthand properties ([#12780](typescript-eslint/typescript-eslint#12780))
- **eslint-plugin:** \[no-unnecessary-condition] no false positive on RHS of a nested logical expression ([#12728](typescript-eslint/typescript-eslint#12728))
- **eslint-plugin:** \[member-ordering] don't report fields that read fields declared before them ([#12729](typescript-eslint/typescript-eslint#12729))

##### ❤️ Thank You

- Josh Goldberg ✨ [@JoshuaKGoldberg](https://github.com/JoshuaKGoldberg)
- Ulrich Stark [@ulrichstark](https://github.com/ulrichstark)

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.70.0) for more information.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.
renovate Bot added a commit to andrei-picus-tink/auto-renovate that referenced this pull request Oct 4, 2026
| datasource | package                          | from   | to     |
| ---------- | -------------------------------- | ------ | ------ |
| npm        | @typescript-eslint/eslint-plugin | 8.69.0 | 8.71.0 |
| npm        | @typescript-eslint/parser        | 8.69.0 | 8.71.0 |


## [v8.71.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8710-2026-09-28)

##### 🚀 Features

- **eslint-plugin:** \[no-unsafe-enum-assignment] add rule ([#12732](typescript-eslint/typescript-eslint#12732))

##### 🩹 Fixes

- **eslint-plugin:** \[no-misused-promises] handle a return outside of any function ([#12912](typescript-eslint/typescript-eslint#12912))
- **eslint-plugin:** \[no-unnecessary-type-assertion] specialize generic assertion report message ([#12832](typescript-eslint/typescript-eslint#12832))
- **eslint-plugin:** \[unbound-method] respect `this: void` on class properties ([7fce9127d](typescript-eslint/typescript-eslint@7fce9127d))
- **eslint-plugin:** \[switch-exhaustiveness-check] always sort literal cases in stable order ([#12885](typescript-eslint/typescript-eslint#12885))

##### ❤️ Thank You

- Evyatar Daud [@StyleShit](https://github.com/StyleShit)
- Fatih Çakır [@wfatih](https://github.com/wfatih)
- Josh Goldberg
- Josh Goldberg ✨
- Zamiell [@Zamiell](https://github.com/Zamiell)

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.71.0) for more information.

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.70.1](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8701-2026-09-21)

##### 🩹 Fixes

- **eslint-plugin:** \[no-misused-promises] handle multiple Promise constituents ([#12904](typescript-eslint/typescript-eslint#12904))
- **eslint-plugin:** \[no-useless-default-assignment] convert the fixer to a suggestion fixer ([#12826](typescript-eslint/typescript-eslint#12826))
- **eslint-plugin:** \[no-unnecessary-condition] handle union-keyed index access on the left-hand side of nullish assignment ([#12747](typescript-eslint/typescript-eslint#12747))
- **eslint-plugin:** \[unbound-method] treat Intl.Collator.prototype.compare as spec-bound ([#12845](typescript-eslint/typescript-eslint#12845))
- **eslint-plugin:** \[no-unnecessary-parameter-property-assignment] account for parameter reassignment ([#12880](typescript-eslint/typescript-eslint#12880))
- **eslint-plugin:** \[await-thenable] prevent autofix from breaking code when removing `await` ([#12716](typescript-eslint/typescript-eslint#12716))
- **eslint-plugin:** \[no-meaningless-void-operator] allow void on assignment expressions ([#12873](typescript-eslint/typescript-eslint#12873))
- **eslint-plugin:** \[no-unnecessary-type-assertion] false positive for empty object asserted to a type alias of Record ([#12869](typescript-eslint/typescript-eslint#12869))
- **eslint-plugin:** \[no-misused-spread] omit WeakMap spread suggestions ([#12850](typescript-eslint/typescript-eslint#12850))
- **eslint-plugin:** \[no-generated-empty-object-type] don't report a mapped type whose keys are not resolved yet ([#12854](typescript-eslint/typescript-eslint#12854))
- **eslint-plugin:** \[no-explicit-any] use unknown\[] for bare any rest parameters ([#12818](typescript-eslint/typescript-eslint#12818))
- **eslint-plugin:** \[no-unnecessary-type-parameters] handle type precedence in the suggestion fixer ([#12637](typescript-eslint/typescript-eslint#12637))
- **eslint-plugin:** \[no-useless-default-assignment] avoid false positives on tuples with a rest element ([#12768](typescript-eslint/typescript-eslint#12768))

##### ❤️ Thank You

- Brad Zacher [@bradzacher](https://github.com/bradzacher)
- Diptajoy Mistry [@diptomistry](https://github.com/diptomistry)
- Grit [@Grit03](https://github.com/Grit03)
- Hugo [@hugop95](https://github.com/hugop95)
- Michael Naumov [@mnaoumov](https://github.com/mnaoumov)
- Mikhail Baev [@baevm](https://github.com/baevm)
- Om Rawat
- Sanath [@sansynx](https://github.com/sansynx)
- Shinji
- Vinccool96
- 김채영 [@cchaeyoung](https://github.com/cchaeyoung)
- 송재욱

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.70.1) for more information.

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.70.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8700-2026-09-07)

##### 🚀 Features

- **eslint-plugin:** \[no-generated-empty-object-type] add rule ([#12730](typescript-eslint/typescript-eslint#12730))

##### 🩹 Fixes

- **eslint-plugin:** \[no-deprecated] report deprecated imported values used in object shorthand properties ([#12780](typescript-eslint/typescript-eslint#12780))
- **eslint-plugin:** \[no-unnecessary-condition] no false positive on RHS of a nested logical expression ([#12728](typescript-eslint/typescript-eslint#12728))
- **eslint-plugin:** \[member-ordering] don't report fields that read fields declared before them ([#12729](typescript-eslint/typescript-eslint#12729))

##### ❤️ Thank You

- Josh Goldberg ✨ [@JoshuaKGoldberg](https://github.com/JoshuaKGoldberg)
- Ulrich Stark [@ulrichstark](https://github.com/ulrichstark)

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.70.0) for more information.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

1 approval >=1 team member has approved this PR; we're now leaving it open for more reviews before we merge bug Something isn't working package: eslint-plugin Issues related to @typescript-eslint/eslint-plugin

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[unbound-method] False positive on Intl.Collator.compare (reopen #4383)

2 participants