打字稿重复功能实现

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&lt;T1,T2&gt; 中提供泛型类型T2,即使我实际上可能没有使用T2。我想我正在尝试实现类似于 c# 的 FuncAction 委托签名的东西。但可能有更好的方法。 如果您指的是在函数的定义中提供泛型类型T2,这并没有什么害处。如果指的是调用函数,则不需要提供任何类型,如emit&lt;number, string&gt;,因为类型将从参数的类型中获取。无论如何,如果有必要,写出没有正文的两个声明(只是一个分号),然后编写 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,或者是否同时通过了arg1arg2

以上是关于打字稿重复功能实现的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖从打字稿中其他文件导入的功能?

在打字稿中扩展枚举

更改打字稿目标会影响编译性能吗?

如何在打字稿中过滤对象数组

打字稿。为啥功能接口中描述的“返回值”类型没有严格执行?

Visual Studio Code 中的打字稿是不是有自动导入功能?