En lenguajes como Java o C#, la sobrecarga de funciones y métodos es una capacidad estándar: se pueden declarar varias funciones con el mismo nombre pero con diferentes parámetros. En JavaScript esto no existe, lo que añade errores potenciales. TypeScript resuelve este problema a nivel de tipos.
En TypeScript no hay una verdadera sobrecarga (múltiples implementaciones). Se pueden declarar varias firmas de una función, pero solo implementar una función. Los errores ocurren cuando hay desincronización entre las firmas declaradas y la implementación, o por un posicionamiento incorrecto de las firmas.
TypeScript soporta la sobrecarga de funciones mediante la declaración de varias firmas seguidas de una única implementación real, compatible con todas las variantes de sobrecarga.
Ejemplo de código:
function sum(a: number, b: number): number; function sum(a: string, b: string): string; function sum(a: any, b: any): any { return a + b; } const a = sum(1, 2); // 3 const b = sum('foo', 'bar'); // "foobar"
Características clave:
¿Se puede definir la implementación de la función antes de declarar todas las firmas de sobrecarga?
No, primero deben estar todas las firmas de sobrecarga y luego la implementación. Error:
// ¡Error! Primero las firmas, luego la implementación function foo(a: number): number { return a } // error function foo(a: string): string { return a } // error
¿TypeScript verifica los valores devueltos en todas las firmas de sobrecarga?
TypeScript garantiza el retorno de tipos según las firmas declaradas solo en el tiempo de compilación; no hay verificación de tipos durante la ejecución.
¿Es necesario cubrir todas las variantes de entradas en una única implementación?
La función-implementación debe manejar correctamente todas las variantes de entrada según las firmas de sobrecarga:
function parse(a: number): string; function parse(a: string): string; function parse(a: number | string): string { return String(a); }
Se declaran varias sobrecargas de la función con diferentes tipos de entradas, pero la implementación no maneja todos los casos y lanza un error en tiempo de ejecución con entradas raras.
Ventajas:
Desventajas:
Cada sobrecarga de la función se cubre con una condición sobre tipos dentro de la implementación, utilizando verificaciones de tipo (typeof/instanceof).
Ventajas:
Desventajas: