编程前端开发者

如何在TypeScript中实现函数重载(function overloading),以及重载与其他语言(例如C#或Java)中的重载有什么区别?

用 Hintsage AI 助手通过面试

答案

在TypeScript中,函数重载是通过声明多个具有不同参数类型和/或数量的函数签名来实现的,但只有一个实现。

主要特点是:实现始终是一个,编译器会检查调用是否符合已声明的签名之一。

示例:

function greet(person: string): string; function greet(person: string, age: number): string; function greet(person: string, age?: number): string { if (age !== undefined) { return `Hello, ${person}. You are ${age}!`; } else { return `Hello, ${person}!`; } } greet('Alice'); // 'Hello, Alice!' greet('Bob', 32); // 'Hello, Bob. You are 32!'

⚠️ 与C#或Java不同,没有多个函数实现——所有签名都解析为一个函数,并且在内部需要进行必要的检查。

有陷阱的问题

在TypeScript中是否需要将每个重载签名实现为单独的函数,就像在C#中那样?

答案: 不需要!在TypeScript中,重载函数只有一个实现。所有变体通过一组签名声明来指定。实现需要在一个函数内部自主处理不同类型的输入参数。

由于不熟悉主题的细微差别而出现的实际错误示例


故事

在一个项目中,开发者声明了两个同名函数,期望像在Java中那样进行重载。最终只工作了最后一个定义的函数,其余的被“覆盖”。这导致了意外的错误并造成了大量的重构时间。


故事

没有在重载函数的实现中进行正确的类型检查。函数时不时地返回了客户期望的不同类型的值,导致发现错误变得困难,因为TypeScript并不验证重载的实现。


故事

仅在类型级别使用重载的实现(声明了签名),但没有确保与运行时实现的兼容性(缺少可选参数和内部处理)。这导致在调用“类型有效”的参数时出现崩溃,因为运行时不支持这些变体。