microsoft / microsoft/TypeScript

Add switch to disable _var unused variable prevention

オープン
#63,143 コメント 10 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

Awaiting More Feedback Suggestion
主要言語
Go
スター
111k
フォーク
14.3k
平均マージ
2日 4時間
マージ済み PR(30日)
132

説明

🔍 Search Terms

leading underscore unused variable

✅ Viability Checklist
⭐ 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 tsc to 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

related: https://stackoverflow.com/questions/79884683/what-is-causing-vs-code-to-ignore-prefixed-arguments-like-arg-ts6133

📃 Motivating Example

https://stackoverflow.com/questions/79884683/what-is-causing-vs-code-to-ignore-prefixed-arguments-like-arg-ts6133

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
  1. 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.

  1. 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.

  1. What workarounds are you using in the meantime?

There is no workaround.

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

ファイルやテストは指定されていません。まず、TypeScript が noUnusedParameters をどのように処理し、アンダースコアが先頭に付いた名前について未使用変数の情報を抑制しているのかを追跡し、その後、コンパイラーの診断と IDE/Tooling の報告を比較します。設定可能なオプションによってコンパイルの成功を維持しながら、それらの変数を未使用として IDE に公開できれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
typescript
領域
compilers
issue の種類
機能追加
難易度
5/5
見積もり時間
1週間以上
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。