microsoft / microsoft/TypeScript
Improve typing of arguments with a function (with respect to overloads)
还没有人认领这个 Issue。
- 主要语言
- Go
- 星标
- 111k
- 派生
- 14.3k
- 平均合并
- 2 天 4 小时
- 30 天内合并 PR
- 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 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
该 issue 提供了一个 TypeScript playground 示例,但没有指明任何仓库文件或测试。先复现 overload 实现和 forwarding call,然后调查 checker 针对 overload 参数的行为;完成的标准是 forwarding call 被接受,并且 conditional branch 在不使用 assertions 或不可达的 runtime checks 的情况下将 bar 窄化为 string。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- typescript
- 领域
- compilers
- Issue 类型
- 功能
- 难度
- 5/5
- 预计耗时
- 一周以上
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100