-
Notifications
You must be signed in to change notification settings - Fork 13.2k
Description
🔍 Search Terms
leading underscore unused variable
✅ Viability Checklist
- This wouldn't be a breaking change in existing TypeScript/JavaScript code
- This wouldn't change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, new syntax sugar for JS, etc.)
- This isn't a request to add a new utility type: https://github.com/microsoft/TypeScript/wiki/No-New-Utility-Types
- This feature would agree with the rest of our Design Goals: https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals
⭐ Suggestion
I always knew that _prefixed variables are ignored, but only recently I learned that it not only makes the IDE ignore unused variables, but it prevents the TS engine itself from even reporting whether a variable is used/unused to the IDE. I personally believe that a language engine should not be concerned by this and instead report everything raw and let the IDE and tooling handle it however the user wants.
What I want is to allow TS engine to compile without errors (if a variable is unused), but still report this information to the IDE and tooling.
Therefore, to not break existing codebases, I propose a new tsconfig flag to disable this implicit behavior.
With this new flag enabled, the TS engine will report whether a variable is used / unused to the IDE even if the variable name is prefixed with _.
This is especially useful in situations when one tries to avoid shadowing variable names, which could unknowingly lead to triggering this implicit behavior. And I am pretty sure that there is a myriad of other use cases where the loss of used/unused information is unwanted and unexpected.
const table = ...
// later
function replaceTable(_table) { // <- wrong, this variable is unused, but the IDE can't report this because of TS
table = makeTable()
}
This setting does not affect noUnusedParameters, instead, they will work in tandem.
// tsconfig
noUnusedParameters: false,
reportUnusedUnderscoreVariables: true // <- just an adhoc placeholder
This will
- allow
tscto compile even if there are unused variables - report unused variables prefixed with
_as unused to the IDE - show squiggles "unused variable" in the IDE
- allow user to configure their tooling (eslint, etc.) to use regular expressions to selectively ignore their chosen variation and be not locked to using
_name
📃 Motivating Example
I wrote a function that uses a column variable, but there was a column defined in the scope, so I renamed it to _column. Later, I encountered a bug and while investigating, I found that the variable was not used, but this fact was unknown to the IDE.
I have some unused parameters in other places, completely intentional, so I already disabled noUnusedParameters in tsconfig, because I don't use underscore _name to denote that a variable is unused. It's noise as I have IDE for that already.
💻 Use Cases
- What do you want to use this for?
I want to use variable names with underscore prefix to avoid shadowing existing variables, but I still want the IDE to report these variables to me for my consideration without breaking the build.
- What shortcomings exist with current approaches?
Regardless of the noUnusedParameters setting, the IDE will not receive information whether a variable is used/unused if it is prefixed with underscore.
- What workarounds are you using in the meantime?
There is no workaround.