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