Considere este ejemplo:
export function fn(arg: string): void; export function fn(arg: number): void; export function fn(arg: any) { console.log(arg); } Entonces, fn se puede llamar con una cadena o un número.
fn('hello!'); fn(42); Hasta aquí todo bien. Pero luego fn se ejecuta en un lugar diferente:
function fn2(arg2: string | number) { fn(arg2); }En este caso, TypeScript se queja:
Ninguna sobrecarga coincide con esta llamada. Sobrecarga 1 de 2, '(arg: string): void', dio el siguiente error.
Argument of type 'string | number' is not assignable to parameter of type 'string'. Type 'number' is not assignable to type 'string'. Overload 2 of 2, '(arg: number): void', gave the following error. Argument of type 'string | number' is not assignable to parameter of type 'number'. Type 'string' is not assignable to type 'number'.ts(2769)
index.tsx(3, 17): la llamada se habría realizado correctamente en esta implementación, pero las firmas de implementación de las sobrecargas no son visibles externamente.
¿Puede alguien ayudarme a entender lo que está pasando aquí?
Las sobrecargas no son lo mismo que los tipos de unión. Las sobrecargas definen funciones 'separadas' mientras que las uniones le permiten poner diferentes tipos como argumentos.
// fails function fn2(arg2: string | number) { fn(arg2); // uses the union type } // works function fn3(arg2: string | number) { if(typeof arg2 === 'string') { return fn(arg2); // uses string } return fn(arg2); // uses number } Esto significa que fn2 busca una declaración de función que tenga un argumento de tipo string|number , mientras que fn3 busca una función con tipo string o una función con tipo number como primer argumento.
No debe usar any si sabe exactamente qué tipo desea como parámetro de función.
Ver la documentación para tipos de unión
Puedes agregar otra sobrecarga
export function fn(arg: string): void; export function fn(arg: number): void; export function fn(arg: any): void; export function fn(arg: any) { console.log(arg); } fn('hello!'); fn(42); function fn2(arg2: string | number) { fn(arg2); }