Skip to content

fix(linter/eslint/id-length): exempt TS interface/type-literal members with never - #26310

Merged
camc314 merged 2 commits into
oxc-project:mainfrom
Pearce-Ropion:pearce/fix-issue-26309
Sep 4, 2026
Merged

camc314 merged 2 commits into
oxc-project:mainfrom
Pearce-Ropion:pearce/fix-issue-26309

Conversation

@Pearce-Ropion

@Pearce-Ropion Pearce-Ropion commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Summary

The id-length lint rule lets users opt out of checking property name lengths via a properties: "never" setting. This exemption worked correctly for plain JavaScript object properties, but was silently ignored for TypeScript interface members and object type literal members. As a result, users who explicitly disabled property length checks would still see false-positive warnings on their TypeScript type definitions.

Why

TypeScript interfaces and type literals describe object shapes using their own dedicated syntax, distinct from JavaScript object literals. The rule's internal logic only recognized the JavaScript form when deciding whether to skip the length check, so the TypeScript equivalents were treated as ordinary identifiers instead of property names, even though users intended the same exemption to apply to both.

Changes

  • The rule now recognizes TypeScript interface and type literal members as property names, so the properties: "never" setting applies to them consistently with plain JavaScript object properties.
  • Added test coverage confirming both the exempted and non-exempted behavior for TypeScript interface and type literal members.

Test plan

  • Added passing test cases showing the exemption now applies to TypeScript interface and type literal members.
  • Added failing test cases confirming the rule still flags these members under its default settings.
  • Verified the fix manually against the exact reproduction case reported in the issue, confirming the false-positive warning no longer occurs.
  • Full linter test suite passes with no regressions.

AI disclosure

Per the repo's AI usage policy: this fix was drafted with AI assistance (Claude), and reviewed, tested, and understood by me before submission. The linked issue itself was also AI-drafted and reviewed by me.

Resolves #26309

…ype-literal members

TSPropertySignature and TSMethodSignature keys fall through to the default
match arm in id-length's handle_identifier_name, so they were checked
unconditionally regardless of the properties option, unlike ObjectProperty.

Fixes oxc-project#26309
Comment thread crates/oxc_linter/src/rules/eslint/id_length.rs
Comment thread crates/oxc_linter/src/snapshots/eslint_id_length.snap Outdated
Signed-off-by: Cameron <cameron.clark@hey.com>

@camc314 camc314 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

thanks!

@camc314 camc314 changed the title fix(linter): id-length properties: never should exempt TS interface/type-literal members fix(linter/eslint/id-length): exempt TS interface/type-literal members with neer Sep 4, 2026
@camc314 camc314 added the A-linter Area - Linter label Sep 4, 2026
@camc314 camc314 self-assigned this Sep 4, 2026
@camc314 camc314 changed the title fix(linter/eslint/id-length): exempt TS interface/type-literal members with neer fix(linter/eslint/id-length): exempt TS interface/type-literal members with never Sep 4, 2026
@codspeed

codspeed Bot commented Sep 4, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 5 untouched benchmarks
⏩ 76 skipped benchmarks1


Comparing Pearce-Ropion:pearce/fix-issue-26309 (879e73b) with main (0f4af5d)

Open in CodSpeed

Footnotes

  1. 76 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@camc314
camc314 merged commit 253cdb2 into oxc-project:main Sep 4, 2026
41 checks passed
graphite-app Bot pushed a commit that referenced this pull request Sep 7, 2026
# Oxlint
### 🚀 Features

- 6a0e19c linter/eslint/no-unmodified-loop-condition: Support `checkConditionalExpressions` option (#26249) (camc314)

### 🐛 Bug Fixes

- 562dd14 jsx-a11y/anchor-has-content: Allow anchors passed as custom component props (#26360) (Mikhail Baev)
- 253cdb2 linter/eslint/id-length: Exempt TS interface/type-literal members with never (#26310) (Pearce Ropion)
- 8c7ea76 ast_visit: Account for trimmed source offsets (#26223) (Cameron)
- 5f9cffc linter/typescript/no-explicit-any: Fix rest parameter to `unknown[]` (#26279) (camc314)
- 4de9fa3 linter/react/jsx-no-literals: Check nested JSX expression literals (#26253) (camc314)
- 07851b9 parser: Fix debug assert failure when lexer error with tokens enabled (#26229) (overlookmotel)
- 9cee146 oxlint/lsp: Don't try to parse fix message, always fallback (#26204) (Sysix)
- a662c40 linter/eslint/no-useless-assignment: Handle destructuring assignments (#25925) (camc314)
- 304bd9a linter/eslint/no-array-constructor: Handle ASI hazards in fixer (#26166) (Hamody We)
- b41bb35 linter: Qualify rules in rules output (#26250) (camc314)
- 895c685 linter/typescript/no-extraneous-class: Avoid deleting class expressions (#26231) (camc314)
- 4ba33c8 linter/eslint/no-unused-vars: Handle stored arrow references (#26225) (camc314)

### 🛡️ Security

- 9a612d5 deps: Update npm packages (#26178) (renovate[bot])
# Oxfmt
### 💥 BREAKING CHANGES

- 2c9a947 parser: [**BREAKING**] Reduce `MAX_LEN` to 256 bytes below `u32::MAX` (#26352) (overlookmotel)

### 🚀 Features

- 68e12ab formatter_css: Follow the oxc-css-parser's acceptance line (#26337) (leaysgur)

### 🐛 Bug Fixes

- f7acdc0 formatter: Treat a JSDoc cast target as opaque in chain layouts (#26375) (leaysgur)
- 104061b formatter: Keep JSDoc cast parens with a comment inside them (#26374) (leaysgur)
- 3d00a76 formatter_css: Keep comment inside important and simple-vars colon (#26370) (leaysgur)
- 172ddb6 formatter_css: Keep a same-line line comment on its line (#26321) (leaysgur)
- cafaf32 formatter_css: Never drop comments inside an at-rule prelude (#26320) (leaysgur)
- 534a0fe formatter_css: Keep a line comment on its comma's line (#26319) (leaysgur)
- 99cfd75 formatter_css: Hide raw comment printing API, use strcut instead (#26316) (leaysgur)
- 2028896 formatter_css: Preserve comments around SCSS/Less variable values (#26276) (leaysgur)
- 6752abc formatter_css: Keep leading comments before (#26272) (leaysgur)
- 3b054de formatter_graphql: Align comment printing after open `{` (#26271) (leaysgur)
- b3c287a formatter_css: Fix SCSS bracket list printing (#26270) (leaysgur)
- bac770a formatter_css: Preserve comment in SCSS paren comma list (#26269) (leaysgur)
- c7b57ef formatter_css: Print SCSS map consisntent with and without comment (#26268) (leaysgur)
- 063e2b6 formatter_css: Preserve trailing comma in single-item scss lists (#26245) (leaysgur)
- 5f9580d oxfmt: Bump prettier-plugin-tailwindcss (#26273) (leaysgur)

### ⚡ Performance

- 1cad286 oxfmt: Match editorconfig once per file (#26239) (Yuji Sugiura)
- 260c5eb oxfmt: Match `overrides` once per file (#26238) (leaysgur)
- 61565bc oxfmt: Share resolved `FormatConfig` via `Arc` instead of cloning per file (#26237) (leaysgur)

### 📚 Documentation

- 32084d4 formatter_core: Clarify printer hard_line compression (#26312) (leaysgur)
- 4fabdcc formatter,formatter_css,formatter_graphql,formatter_yaml: Update DIVERGENCES.md (#26267) (leaysgur)
- 26a1fa4 formatter_core: Refine FORMATTER_POLICY (#26266) (leaysgur)

### 🛡️ Security

- 9a612d5 deps: Update npm packages (#26178) (renovate[bot])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-linter Area - Linter

Projects

None yet

Development

Successfully merging this pull request may close these issues.

linter: id-length properties: "never" does not exempt TypeScript interface / type-literal property signatures

2 participants

Sponsor
SponsoredKunjungi sekarang
Promo