Typescript 类型脚本函数重载

Typescript 类型脚本函数重载,typescript,Typescript,为了减少老化灰质的认知负荷,我在事件发射器中为特定事件提供自定义重载 //默认签名 函数on(事件:字符串|符号,侦听器:(…args:any[])=>void:void; //自定义签名 函数开启(事件:“错误”,侦听器:(错误:字符串,代码:数字)=>void:void; 函数开(事件:“数据”,侦听器:(文本:字符串)=>void:void; 函数on(事件:“chunk”,侦听器:(text:string)=>void:void; 函数开启(事件:“完成”|“完成”),侦听器:(id:n

为了减少老化灰质的认知负荷,我在事件发射器中为特定事件提供自定义重载

//默认签名
函数on(事件:字符串|符号,侦听器:(…args:any[])=>void:void;
//自定义签名
函数开启(事件:“错误”,侦听器:(错误:字符串,代码:数字)=>void:void;
函数开(事件:“数据”,侦听器:(文本:字符串)=>void:void;
函数on(事件:“chunk”,侦听器:(text:string)=>void:void;
函数开启(事件:“完成”|“完成”),侦听器:(id:number)=>void:void;
//最一般签名
函数打开(事件:任意,侦听器:(…参数:任意[])=>void){
// ...
}
//将数据正确解析为“字符串”
关于(“数据”,(数据)=>{});
on(“块”,“数据)=>{});
//错误地将id解析为来自默认签名的任意id
on(“complete”,(id)=>{});
根据TypeScript文档,我已经在特定重载之后排序了常规重载

我的问题是,;为什么联合类型(
“complete”|“done”
)不能按预期工作,但将它们分开(
“data”和“chunk”
)却可以工作?

<

为了让编译器选择正确的类型检查,它遵循与底层JavaScript类似的过程。它查看重载列表,并继续第一次重载,尝试使用提供的参数调用函数。如果找到匹配项,它将选择此重载作为正确的重载出于这个原因,通常会将重载从最特定到最不特定进行排序。

我确实看到,有时编译器确实会通过查找更具体的签名来选择重载“无序”,即使它们不是列表中的第一个匹配签名(例如,请参阅)。。。但是当你怀疑的时候,如果你从最具体的到最普遍的列出你的重载,你会得到最好的表现。例如:

// custom signatures
function on(event: "error", listener: (error: string, code: number) => void): void;
function on(event: "data", listener: (text: string) => void): void;
function on(event: "chunk", listener: (text: string) => void): void;
function on(event: "complete" | "done", listener: (id: number) => void): void;
// default signature
function on(event: string | symbol, listener: (...args: any[]) => void): void;
// implementation signature
function on(event: any, listener: (...args: any[]) => void) {
  // ...
}

这应该是你想要的。希望有帮助。祝你好运

不知道我怎么老是错过那个!但你的答案和广告上的一样有效。谢谢你甚至可以把
数据
结合起来,要求得到一个更全面的答案(正如我想象的那样)