microsoft / microsoft/TypeScript

Never-initialized variable type is not narrowed to undefined

オープン
#61,496 コメント 4 件 リアクション 0 件 担当者 0 名 GitHub で見る
Awaiting More Feedback Suggestion
主要言語
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

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

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