TypeScript 重复函数实现

78

我已经在同一个 Typescript 类中定义了以下两个函数签名,即:

public emit<T1>(event: string, arg1: T1): void {}

并且

public emit<T1,T2>(event: string, arg1: T1, arg2: T2): void {}

然而,当我转译 TypeScript 时,我遇到了以下错误。

error TS2393: Duplicate function implementation.

我原以为在TypeScript中,如果函数的参数数量不同,就可以重载函数。但由于上述签名分别有2个和3个参数,为什么我会收到这个转译错误?


1
TypeScript 中没有函数重载,甚至没有泛型。 - Tamas Hegedus
10
请仔细阅读有关重载的文档。重载并不意味着您可以提供多个实现,而是可以提供多个签名,但只使用单个实现。但在这种情况下,为什么不直接编写arg2?呢? - user663031
@torazaburo。我正在尝试通过泛型来确保类型安全。如果我使用arg2?,即使我可能实际上并没有使用 T2,我仍然需要在 emit<T1,T2> 中提供通用类型 T2 。我想我正试图实现类似于C#中 FuncAction 委托签名的内容。但可能有更好的方法。 - James B
2
如果您是指在函数的定义中提供通用类型T2,那么这不会有任何影响。如果您是指调用函数,则不需要提供任何类型,例如emit<number, string>,因为类型将从参数的类型中获取。无论如何,如果必要,只需写出两个没有主体的声明(只有分号),然后编写一个实现,以某种方式检查arg2的存在,或者为其分配默认值。 - user663031
这个回答解决了你的问题吗?TypeScript函数重载 - Vega
3个回答

65

我假定你的代码看起来像这样:

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
}

12
在 TypeScript 中进行函数重载时,你只需要使用一个实现并提供多个签名即可。请参考 https://dev59.com/1mYs5IYBdhLWcg3wAfPO。 - Matthew K
3
那么如果这三个函数包含不同的逻辑呢? - Prashant Pimpale
有三个签名,但只有一个实现。如果您需要根据使用的签名来使用不同的逻辑,则需要在实现内添加一些额外的检查。例如,您可以检查 args.length 来确定是否仅传递了 arg1,还是同时传递了 arg1arg2 - Mattias Buelens
1
这些都是无返回值函数。但如何处理泛型返回值呢?例如,如果第一个重载的返回类型是 T1(或 string),而第二个重载的返回类型是 T2,该怎么办? - Ark-kun

14

如果您在同一窗口中打开TypeScript和JavaScript文件,可以通过三种方式解决此问题:

第一种解决方案:

仅打开TypeScript文件或仅打开JavaScript文件

第二种解决方案 - 运行此命令:

tsc --init

此命令将创建用于TypeScript配置的tsconfig.json文件。

最后一种解决方案 在文件顶部写入

export{}


13
export {}

只需在 TypeScript 文件顶部添加此行


4
可以,它有效。问题是:为什么? :-) - Andreas Susewind
另一个导致错误的原因是由于旧脚本文件引起的故障。如果您在文件中仅有一个函数定义,请添加export {}行到您的文件中,使其成为ES模块。 - aditya tyagi
还在遇到错误, 未捕获的引用错误:exports未定义 在app.js的第2行第23列 以上错误是在将TypeScript编译并转换为JavaScript后出现的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接