Unreachable returns badly break return type inference

オープン
#55,437 コメント 7 件 リアクション 1 件 担当者 0 名 GitHub で見る

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

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
38/100
issue の種類
バグ
明瞭さ
おおむね明確
活発さ
停滞
技術スタック
typescript
領域
compilers

調査の方向性

リンクされている TypeScript Playground の再現例から始め、allowUnreachableCode 下での f、g、h の推論された宣言を比較します。コンパイラによる戻り値の型の推論と到達不能コードの処理を追跡します。g と h が f と同様に number を推論し、関連する noImplicitAny 診断が生成されれば完了です。

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

説明

Awaiting More Feedback Suggestion
🔎 Search Terms

unreachable any return

🕗 Version & Regression Information
  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about let
⏯ Playground Link

https://www.typescriptlang.org/play?target=7&jsx=0&ts=5.2.0-beta&allowUnreachableCode=true#code/GYVwdgxgLglg9mABMAFASgN6IPTcQBwCc58BTQgGwE9FDThy6ATRAQwGdEwQBbAI3IAoAJAVSURAA8A3FMQBeRAEZZdKCEJIZI3IgBypSRIowwpREzilOYOBNbAG0WuI1IoVMolMM6kUgBcIpIKiABEwHBwYYIAvoKgkLAIiADm6Fi6PoykLBxsYFQiYhIycooqLuqaUtI6eAZGiCZmiADWMBQUnGpuiB5e2X4QgSK9NdrxidDwSAAWGTh4Q8xsnKyFY641KvX6hsam5h1dPdvunuZDpP5BouKIVLI0Farnj3XxQA

💻 Code
function f(){ // properly referred as number
	let x; x = 1; return x;
	// Next line does not affect return type inference:
	x = "foo"
}
function g(){ // inferred as any
	let x; x = 1; return x;
	// Next line kills return type inference:
	return x;
}
function h(){ // inferred as any
	return 1;
	// Next line kills return type inference:
	let y; y = 1; return y;
}
🙁 Actual behavior

The types are inferred as:

declare function f(): number;
declare function g(): any;
declare function h(): any;

The case of f demonstrates that return types based on assignment to mutable variables can work. The unreachable assignment to x after return has no effect on the return type.

In the case of g, the return type should be unaffected - x is already inferred to be number and an extra return does not change the type of x.

In the case of h, the return type should be unaffected as well. The second return can be inferred to be number.

🙂 Expected behavior

The types should be inferred as:

declare function f(): number;
declare function g(): number;
declare function h(): number;

Either unreachable return statements should not affect return type or return should not stop type inference.

Also, the code should be flagged by the noImplicitAny rule.

Additional information about the issue

possibly related to #40393
likely related to #26914

Disabling allowUnreachableCode does not alleviate these issues.

主要言語
Go
スター
111k
フォーク
14.4k
平均マージ
1日 19時間
マージ済み PR(30日)
117

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

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

はじめの一歩

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

microsoft/TypeScript のほかの issue

microsoft/TypeScript の issue をすべて見る

似ている issue

Go の issue をもっと見る

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

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