En TypeScript, la sobrecarga de funciones se logra mediante la declaración de múltiples firmas de función con diferentes tipos y/o cantidades de argumentos, pero con una sola implementación.
La característica principal: siempre hay una sola implementación, y el compilador verifica que la llamada coincida con una de las firmas declaradas.
function greet(person: string): string; function greet(person: string, age: number): string; function greet(person: string, age?: number): string { if (age !== undefined) { return `¡Hola, ${person}. Tienes ${age} años!`; } else { return `¡Hola, ${person}!`; } } greet('Alice'); // '¡Hola, Alice!' greet('Bob', 32); // '¡Hola, Bob. Tienes 32 años!'
⚠️ A diferencia de C# o Java, no hay múltiples implementaciones de la función; todas las firmas se resuelven en una sola función con verificación obligatoria en su interior.
¿Es necesario implementar cada firma sobrecargada en TypeScript como una función separada, como en C#?
Respuesta: ¡No! En TypeScript, la función sobrecargada tiene solo una implementación. Todas las variaciones se definen a través de un conjunto de declaraciones de firmas. La implementación debe manejar por sí misma las diferentes variantes de los parámetros de entrada dentro de una sola función.
Historia
En un proyecto, un desarrollador declaró dos funciones con el mismo nombre, esperando una sobrecarga como en Java. Como resultado, solo funcionó la última función definida y las demás fueron "sobrescritas". Esto llevó a errores inesperados y a un enorme gasto de tiempo en refactorización.
Historia
No se implementó una verificación de tipos adecuada dentro de la implementación de la función sobrecargada. La función devolvía periódicamente valores de un tipo diferente al esperado por los clientes, lo que complicaba la detección de errores ya que TypeScript no valida la implementación de las sobrecargas.
Historia
Usaron la implementación de la sobrecarga solo a nivel de tipos (declararon firmas), pero no aseguraron la compatibilidad con la implementación en tiempo de ejecución (falta de parámetros opcionales y manejos dentro de la función). Esto provocó caídas al invocar con parámetros "válidos por tipo", ya que en tiempo de ejecución esos casos no eran admitidos.