打字稿重复功能实现
Posted
技术标签:
【中文标题】打字稿重复功能实现【英文标题】:Typescript Duplicate Function Implementation 【发布时间】: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
的存在,或者可能为其分配一个默认值.
【参考方案1】:
export
只需在打字稿文件的顶部添加这一行
【讨论】:
它有效。问题是:为什么? :-)【参考方案2】:我假设您的代码如下所示:
public emit<T1>(event: string, arg1: T1): void
public emit<T1,T2>(event: string, arg1: T1, arg2: T2): void
public emit(event: string, ...args: any[]): void
// actual implementation here
问题是你在前两行之后有。这实际上定义了一个函数的 空实现,例如:
function empty()
您只想为函数定义一个类型,而不是一个实现。所以用分号替换空块:
public emit<T1>(event: string, arg1: T1): void;
public emit<T1,T2>(event: string, arg1: T1, arg2: T2): void;
public emit(event: string, ...args: any[]): void
// actual implementation here
【讨论】:
当你在 TypeScript 中重载时,你只有一个具有多个签名的实现。见***.com/questions/13212625/… 那么如果这三个函数包含不同的逻辑呢? 共有三个签名,但只有一个实现。如果根据使用的签名需要不同的逻辑,则需要在实现中添加一些额外的检查。例如,您可以检查args.length
以确定是否仅通过了arg1
,或者是否同时通过了arg1
和arg2
。以上是关于打字稿重复功能实现的主要内容,如果未能解决你的问题,请参考以下文章