ProgramaciónDesarrollador Frontend

¿Cómo funciona la tipificación de funciones con REST y la desestructuración de parámetros en TypeScript? ¿Qué errores surgen al tipificar incorrectamente tales funciones?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

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.

Pregunta capciosa

¿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.

Ejemplos de errores reales por desconocer los matices del tema


Historia

En el proyecto durante la migración de funciones con parámetros de JavaScript a TypeScript, se indicó solo el tipo para el objeto, pero no para los campos individuales. Como resultado, una llamada a la función sin parámetros provocó que la aplicación fallara con un error de desestructuración: undefined no tiene la propiedad name.

Historia

Al trabajar con parámetros rest, se olvidaron de indicar explícitamente el tipo del arreglo. En la función, el tipo era 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.