【问题标题】: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 的存在,或者可能为其分配一个默认值.

标签: javascript typescript


【解决方案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 中重载时,你只有一个具有多个签名的实现。见stackoverflow.com/questions/13212625/…
  • 那么如果这三个函数包含不同的逻辑呢?
  • 共有三个签名,但只有一个实现。如果根据使用的签名需要不同的逻辑,则需要在实现中添加一些额外的检查。例如,您可以检查args.length 以确定是否仅通过了arg1,或者是否同时通过了arg1arg2
猜你喜欢
  • 2017-10-26
  • 1970-01-01
  • 2020-03-03
  • 2021-11-17
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2020-04-25
  • 2021-06-30
相关资源
最近更新 更多