Create flag strictVariableInitialization
まだ誰も着手していません。
評価
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 初心者へのやさしさ
- 30/100
- issue の種類
- 機能追加
- 明瞭さ
- 明確に書かれている
- 活発さ
- 停滞
- 技術スタック
- javascript, typescript
- 領域
- compilers
調査の方向性
まず、提案されている strictVariableInitialization の動作と、その動機となる Closure の例を確認し、次に strictPropertyInitialization と比較します。到達可能なコードパスと undefined を含む型をどのように扱うかを定義します。提案の設計が確定し、出力される JavaScript を変更せずに対応するコンパイラーの動作が実装されていれば完了です。
索引モデルが issue の本文から書いたものです。
説明
🔍 Search Terms
uninitialized variable, undefined, closure, strict property initialization,
✅ 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 would like to see a check that ensures that no variable whose type is not permitted to be undefined may remain uninitialized at the end of its scope.
📃 Motivating Example
TypeScript allows unsafety that can and does catch users by surprise when using variables in a closure. Normally, TS won't let you access an uninitialized variable:
function doSomething() {
let foo: string;
foo.toLowerCase(); // TS ERROR: Variable 'foo' is used before being assigned
}
However, TypeScript optimistically assumes that variables are initialized when used in closures.
let foo: string;
function printFoo() {
console.log(foo.toLowerCase());
}
printFoo(); // Uncaught TypeError: Cannot read properties of undefined (reading 'toLowerCase')
That's for good reason, but sometimes, as in the above case, this is provably unsafe, since foo is guaranteed not to be initialized.
The new flag "strictVariableInitialization" ensures that a variable must be initialized by the end of all reachable codepaths in its scope.
let foo: string; // (proposed) TS ERROR: `foo` is not initialized in all reachable codepaths
function printFoo() {
console.log(foo.toLowerCase());
}
printFoo()
Of course, variables whose type includes undefined are still permitted to be uninitialized.
let foo: string | undefined;
function printFoo() {
console.log(foo?.toLowerCase());
}
printFoo();
This check is highly analogous to strictPropertyInitialization for classes.
💻 Use Cases
See https://github.com/typescript-eslint/typescript-eslint/issues/9565 for a somewhat-wordier proposal in typescript-eslint, and https://github.com/typescript-eslint/typescript-eslint/issues/4513 and https://github.com/typescript-eslint/typescript-eslint/issues/10055#issuecomment-2374797860 for cases where this has caused confusion in the wild.
In short, people who have written code that does check for initialization of non-nullable variables become confused by the linter informing them that the check is unnecessary according to the types, even though they can see that it is necessary at runtime:
let foo: Something
function useFoo() {
if (foo != null) { // linter flags this condition as unnecessary since foo cannot be nullish
foo.bar();
}
}
The code should be rewritten as
let foo: Something | undefined
function useFoo() {
if (foo != null) {
foo.bar();
}
}
- 主要言語
- Go
- スター
- 111k
- フォーク
- 14.4k
- 平均マージ
- 1日 19時間
- マージ済み PR(30日)
- 117
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
microsoft/TypeScript のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
microsoft/TypeScript#64322 · コメント 2 件 · リアクション 1 件 · 担当者 2 名 ·
-
Possible Improvement
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
microsoft/TypeScript#64278 · コメント 1 件 · リアクション 1 件 ·
-
Docs
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
microsoft/TypeScript#64118 · コメント 1 件 ·
-
難易度 1/5 1時間未満 初心者へのやさしさ 88/100
microsoft/TypeScript#64094 ·
-
Docs
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
microsoft/TypeScript#63959 · コメント 5 件 ·
microsoft/TypeScript の issue をすべて見る
似ている issue
-
optimization optimization:agents-md-curator
難易度 2/5 1〜3時間 初心者へのやさしさ 86/100
githubnext/gh-aw-cao#13143 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
blinklabs-io/bursa#904 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
yanet-platform/ipfw-go#129 ·
-
bug confmap/provider/googlesecretmanagerprovider needs triage
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
open-telemetry/opentelemetry-collector-contrib#51273 · コメント 2 件 ·
-
bug: AI Gateway client filter lists "Unknown" twice when NULL and literal Unknown clients coexist オープンbug
難易度 2/5 1〜3時間 初心者へのやさしさ 90/100