TypeScript admite la tipificación precisa de funciones utilizando parámetros rest y desestructuración. Esto es especialmente importante para funciones que aceptan un número variable de argumentos o objetos complejos.
La desestructuración en los parámetros de la función permite especificar explícitamente la estructura de las propiedades esperadas:
function printUser({ name, age }: { name: string; age: number }) { console.log(`${name} (${age})`); }
Los parámetros rest permiten establecer un número variable de argumentos y su tipo:
function sum(...numbers: number[]): number { return numbers.reduce((acc, cur) => acc + cur, 0); }
El uso combinado se encuentra en funciones que aceptan un objeto principal y un arreglo adicional de parámetros:
function logEvent(event: { type: string }, ...meta: any[]) { console.log(event.type, meta.join(',')); }
Una correcta tipificación permite identificar errores antes de ejecutar el código, pero una tipificación incorrecta resultará en pérdida de seguridad de tipos y errores en tiempo de ejecución.
¿Cómo establecer el tipo para una función con parámetros desestructurados por defecto y hacerlos opcionales?
Muchos indican el tipo del objeto, pero olvidan hacer cada campo opcional o establecer valores por defecto al mismo tiempo que el tipo:
function foo({x = 1, y = 2}: {x?: number; y?: number} = {}) { console.log(x, y); }
Aquí se establecen valores por defecto y todos los parámetros se hacen opcionales usando ?. Sin esto, la llamada sin parámetros provocará un error, a pesar de que se espera un valor por defecto.
Historia
undefined no tiene la propiedad name.Historia
any[], lo que permitió el paso de no solo números. En producción, de repente se sumaron números y cadenas, obteniendo resultados incorrectos en los informes.Historia
Se utilizó la desestructuración con un objeto profundamente anidado, pero no se indicaron los tipos anidados. Debido a esto, TypeScript "se perdió" y no indicó la falta de un campo obligatorio en los objetos, lo que llevó a un error TypeError: Cannot read property 'id' of undefined del lado del cliente.