microsoft / microsoft/TypeScript
Improve typing of arguments with a function (with respect to overloads)
まだ誰も着手していません。
- 主要言語
- Go
- スター
- 111k
- フォーク
- 14.3k
- 平均マージ
- 2日 4時間
- マージ済み PR(30日)
- 132
説明
Search Terms
function overload arguments narrowing
Suggestion
The example is probably the best illustration I can give... It's also much clearer (I think) that the description in text.
Currently, the types of the arguments of a function with overloads cannot be forwarded to another function with the same overloads (1) because the raw typing of the argument doesn't match any of the overloads. But, at the same time, this restriction is not carried out in the relationship between the arguments' types is not used once in the function's body.
We currently have to either assert types (using as) or do if (...) throw with conditions that will never be met runtime.
That requires to sacrifice either type safety or performance.
I've seen #13225. However, my suggestion is more regarding the arguments than the return type. It shouldn't impose any additional restrictions that currently exist (actually, remove some).
Moreover, one of the arguments that was given at the time ("Pass-through overloads are extremely common and would require writing "artificial" code to satisfy the checker") is not true anymore. (See point (1) in the example). I'm not sure if this particular point should be considered a bug in itself or not...
Having the type-system aware of the overloads when typing the arguments could actually restore this.
Use Cases
Simplify overloads implementation and make them more readable.
Examples
let baz: string;
function fn2(foo: 'a', bar: string): void;
function fn2(foo: 'b', bar: number): void;
function fn2(foo: 'a' | 'b', bar: string | number): void
{
fn(foo, bar); // (1) If this doesn't work, ...
}
function fn(foo: 'a', bar: string): void;
function fn(foo: 'b', bar: number): void;
function fn(foo: 'a' | 'b', bar: string | number): void
{
if (foo == 'a')
{
baz = bar; // (2) ... This should!
}
}
Checklist
My suggestion meets these guidelines:
- 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. new expression-level syntax)
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
この issue には TypeScript playground の例がありますが、リポジトリのファイルやテストは指定されていません。まず overload の実装と forwarding call を再現し、その後、overload 引数に関する checker の挙動を調査します。完了条件は、forwarding call が受け入れられ、conditional branch によって assertions や到達不能な runtime checks なしで bar が string に絞り込まれることです。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- typescript
- 領域
- compilers
- issue の種類
- 機能追加
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100