microsoft / microsoft/TypeScript
Never-initialized variable type is not narrowed to undefined
- 主要言語
- Go
- スター
- 111k
- フォーク
- 14.3k
- 平均マージ
- 2日 4時間
- マージ済み PR(30日)
- 132
説明
### 🔎 Search Terms
narrow uninitialized, uninitialized undefined
### 🕗 Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about `initialized`/`uninitialized`
### ⏯ Playground Link
https://www.typescriptlang.org/play/?ts=5.9.0-dev.20250326#code/MYewdgzgLgBAZiEMC8MAUUDuIBcNoBOAlmAOYCUeAbiEQCYoB8MA3gFAwwBEArhAKb4oxYFC4BuDjCkB6GTH4QANiSgBaOkQgBDAEZL+asPwAe6lcZgABKAE8ADouDF76xRagySRdXX7AlbQJtKCJwCCkDWHB+PEISUhgAHxgeMD84En46SSkiOHQYlGRULBByVilOORgAPQB+KpgagDlEeykAXzZutgQQNC4ucnEgA
### 💻 Code
```ts
const foo = (two: string): void => {
"use strict";
// eslint-disable-next-line @typescript-eslint/init-declarations
let one: string | undefined;
if (one === two) {
// ^? let one: string | undefined
// Noop
}
}
foo("");
```
### 🙁 Actual behavior
The type is not narrowed, which prevents typescript-eslint from flagging this comparison that always fails: [typescript-eslint playground](https://typescript-eslint.io/play/#ts=5.7.2&fileType=.tsx&code=MYewdgzgLgBAZiEMC8MAUUDuIBcNoBOAlmAOYCUeAbiEQCYoB8MA3gFAwwBEArhAKb4oxYFC4BuDjCkB6GTH4QANiSgBaOkQgBDAEZL%2BasPwAe6lcZgABKAE8ADouDF76xRagySRdXX7AlbQJtKCJwCCkDWHB%2BPEISUhgAHxgeMD84En46SSkiOHQYlGRULBByVilOORgAOUR7KQBfNha2BBA0Li5ycSA&eslintrc=N4KABGBECmAeAu0B2ATAzpAXGA2uCU0aANgJZLyYCGxxkANPhJAA7ECuA5uZgALwBPFkQDGAJ1It4AWiJkKAehp18AXUbMx7YkSxhQEAL4hDQA&tsconfig=N4KABGBEDGD2C2AHAlgGwKYCcDyiAuysAdgM6QBcYoEEkJemy0eAcgK6qoDCAFutAGsylBm3TgwAXxCSgA&tokens=false)
### 🙂 Expected behavior
The `one === two` comparison should be flagged because it always returns false (there is no way `one` has any value other than `undefined`).
### Additional information about the issue
Also filed a related issue with ESLint: https://github.com/eslint/eslint/issues/19581
コントリビューションガイド
調査の方向性
TypeScript Playground のリンクと `one === two` の例を使ってこの動作を再現し、その後、制御フローの narrowing が一度も初期化されていない変数をどのように扱うかを追跡します。結果を、常に false になるはずの比較と照らし合わせ、関連するコンテキストについてリンク先の ESLint issue を参照します。比較が不可能なものとして認識され、関係のない narrowing の動作を変更しなければ完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- typescript
- 領域
- compilers
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 45/100