【发布时间】:2017-02-03 00:36:39
【问题描述】:
我在同一个Typescript类中定义了以下两个函数签名,即
public emit<T1>(event: string, arg1: T1): void {}
和
public emit<T1,T2>(event: string, arg1: T1, arg2: T2): void {}
但是,在编译打字稿时,我收到以下错误
error TS2393: Duplicate function implementation.
我认为你可以在 typescript 中重载函数,只要函数签名中的参数数量不同。鉴于上述签名分别有 2 个和 3 个参数,为什么会出现此转译错误?
【问题讨论】:
-
打字稿中没有函数重载,即使没有泛型也没有。
-
请仔细阅读有关重载的文档。重载并不意味着你可以提供多个实现;这意味着您可以通过单个实现提供多个签名。但是在这种情况下,你为什么不简单地写
arg2?? -
@torazaburo。我试图通过泛型来确保类型安全。如果我使用
arg2?,我仍然必须在emit<T1,T2>中提供泛型类型T2,即使我实际上可能没有使用T2。我想我正在尝试实现类似于 c# 的Func和Action委托签名的东西。但可能有更好的方法。 -
如果您指的是在函数的定义中提供泛型类型
T2,这并没有什么害处。如果指的是调用函数,则不需要提供任何类型,如emit<number, string>,因为类型将从参数的类型中获取。无论如何,如果有必要,写出没有正文的两个声明(只是一个分号),然后编写 one 实现以某种方式检查arg2的存在,或者可能为其分配一个默认值.
标签: javascript typescript