-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
fix(eslint-plugin): [no-shadow] ignore declare variables in definition files shadowing global variables #10710
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): [no-shadow] ignore declare variables in definition files shadowing global variables #10710
Conversation
Having "declare"-tagged variables with the same name as global variables will raise an error with no-shadow even though they are types. This is a false positive due to the "declare" variables being interpreted as values during analysis. This also happens most frequently in definition files. Let's change the logic such that "declare"-tagged variables in definition files are ignored under the no-shadow rule.
Thanks for the PR, @sopa301! 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 site configuration. |
View your CI Pipeline Execution ↗ for commit a237ac2.
☁️ Nx Cloud last updated this comment at |
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## main #10710 +/- ##
=======================================
Coverage 87.19% 87.19%
=======================================
Files 450 450
Lines 15632 15640 +8
Branches 4570 4573 +3
=======================================
+ Hits 13630 13638 +8
Misses 1645 1645
Partials 357 357
Flags with carried forward coverage won't be shown. Click here to find out more.
|
…t-eslint into 2654-fix-no-shadow-global-declare
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.
🔥 looks great to me, thanks!
| datasource | package | from | to | | ---------- | -------------------------------- | ------ | ------ | | npm | @typescript-eslint/eslint-plugin | 8.22.0 | 8.23.0 | | npm | @typescript-eslint/parser | 8.22.0 | 8.23.0 | ## [v8.23.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8230-2025-02-03) ##### 🚀 Features - **eslint-plugin:** \[no-unnecessary-boolean-literal-compare] enforce strictNullChecks ([#10712](typescript-eslint/typescript-eslint#10712)) ##### 🩹 Fixes - **eslint-plugin:** \[no-shadow] ignore declare variables in definition files shadowing global variables ([#10710](typescript-eslint/typescript-eslint#10710)) - **eslint-plugin:** \[no-restricted-imports] support regex option ([#10699](typescript-eslint/typescript-eslint#10699)) - **eslint-plugin:** \[dot-notation] handle noPropertyAccessFromIndexSignature true ([#10644](typescript-eslint/typescript-eslint#10644)) - **eslint-plugin:** \[prefer-nullish-coalescing] fix missing return ([#10732](typescript-eslint/typescript-eslint#10732)) - bump ts-api-utils to ^2.0.1 ([#10761](typescript-eslint/typescript-eslint#10761)) - **eslint-plugin:** \[no-unnecessary-template-expression] allow interpolating type parameter in type context ([#10739](typescript-eslint/typescript-eslint#10739)) - **eslint-plugin:** \[switch-exhaustiveness-check] suggest with qualified name ([#10697](typescript-eslint/typescript-eslint#10697)) - **eslint-plugin:** \[no-unnecessary-type-assertion] should report readonly class properties with a literal initializer ([#10618](typescript-eslint/typescript-eslint#10618)) ##### ❤️ Thank You - Josh Goldberg ✨ - Olivier Zalmanski [@OlivierZal](https://github.com/OlivierZal) - Ryan Poon [@sopa301](https://github.com/sopa301) - YeonJuan [@yeonjuan](https://github.com/yeonjuan) - Yukihiro Hasegawa [@y-hsgw](https://github.com/y-hsgw) You can read about our [versioning strategy](https://main--typescript-eslint.netlify.app/users/versioning) and [releases](https://main--typescript-eslint.netlify.app/users/releases) on our website.
| datasource | package | from | to | | ---------- | -------------------------------- | ------ | ------ | | npm | @typescript-eslint/eslint-plugin | 8.22.0 | 8.23.0 | | npm | @typescript-eslint/parser | 8.22.0 | 8.23.0 | ## [v8.23.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8230-2025-02-03) ##### 🚀 Features - **eslint-plugin:** \[no-unnecessary-boolean-literal-compare] enforce strictNullChecks ([#10712](typescript-eslint/typescript-eslint#10712)) ##### 🩹 Fixes - **eslint-plugin:** \[no-shadow] ignore declare variables in definition files shadowing global variables ([#10710](typescript-eslint/typescript-eslint#10710)) - **eslint-plugin:** \[no-restricted-imports] support regex option ([#10699](typescript-eslint/typescript-eslint#10699)) - **eslint-plugin:** \[dot-notation] handle noPropertyAccessFromIndexSignature true ([#10644](typescript-eslint/typescript-eslint#10644)) - **eslint-plugin:** \[prefer-nullish-coalescing] fix missing return ([#10732](typescript-eslint/typescript-eslint#10732)) - bump ts-api-utils to ^2.0.1 ([#10761](typescript-eslint/typescript-eslint#10761)) - **eslint-plugin:** \[no-unnecessary-template-expression] allow interpolating type parameter in type context ([#10739](typescript-eslint/typescript-eslint#10739)) - **eslint-plugin:** \[switch-exhaustiveness-check] suggest with qualified name ([#10697](typescript-eslint/typescript-eslint#10697)) - **eslint-plugin:** \[no-unnecessary-type-assertion] should report readonly class properties with a literal initializer ([#10618](typescript-eslint/typescript-eslint#10618)) ##### ❤️ Thank You - Josh Goldberg ✨ - Olivier Zalmanski [@OlivierZal](https://github.com/OlivierZal) - Ryan Poon [@sopa301](https://github.com/sopa301) - YeonJuan [@yeonjuan](https://github.com/yeonjuan) - Yukihiro Hasegawa [@y-hsgw](https://github.com/y-hsgw) You can read about our [versioning strategy](https://main--typescript-eslint.netlify.app/users/versioning) and [releases](https://main--typescript-eslint.netlify.app/users/releases) on our website.
PR Checklist
Overview
I added an additional guard clause checking if a variable has a
declare
tag and removing it from consideration under no-shadow if it does. The code may look very clunky because the conditional statements were derived through experimentation, so they may not catch all cases. Apologies for the mess, and do let me know how I may improve it.There's one thing I couldn't figure out how to handle: The test case on
no-shadow.test.ts
, line953
demonstrates the current behaviour when there is adeclare
keyword variable being shadowed by another in an inner scope. Should we have the error point to thedeclare
variable or the global variable? 🧼