ProgramaciónDesarrollador Fullstack

¿Cómo funciona la tipificación de arreglos en TypeScript, cómo declarar correctamente arreglos con elementos de diferentes tipos, y qué formas hay de describirlos utilizando tuplas? Proporcione ejemplos y explique los posibles errores relacionados con el trabajo con estas estructuras.

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

En TypeScript, los arreglos se describen de dos maneras principales: tipo[] y Array<tipo>. Para los arreglos con elementos de diferentes tipos se utilizan tipos de unión (union types) o tuplas (tuples), que permiten describir un conjunto fijo de elementos de diferentes tipos y cantidades.

Declaraciones de arreglos:

let numbers: number[] = [1, 2, 3]; let strings: Array<string> = ['a', 'b', 'c'];

Arreglo con elementos de diferentes tipos:

let mixed: (string | number)[] = [1, 'a', 2];

Tuplas:

let tuple: [string, number, boolean] = ['hello', 42, true];

Es más conveniente trabajar con tuplas cuando se espera una estructura fija (por ejemplo, retornar de una función varios valores de diferentes tipos a la vez), mientras que con arreglos se trabaja cuando la cantidad y el tipo de los elementos puede estar mezclado o no se conoce de antemano.

Pregunta capciosa.

¿Se puede agregar elementos a una tupla con longitud N después de definirla mediante push? ¿Cómo afecta esto a la tipificación?

Respuesta: Sí, se pueden agregar elementos a la tupla — el compilador lo permite, aunque esto rompe la premisa de la limitación de longitud de la tupla. Los tipos de los nuevos elementos se convertirán en la unión de todos los posibles tipos de los elementos de la tupla:

let tuple: [number, string] = [42, 'foo']; tuple.push(true); // ¡OK! La tupla ahora: [number, string, boolean], pero el tipo no se actualizó, ¡y no hay error! console.log(tuple); // [42, 'foo', true]

Por lo tanto, es necesario controlar manualmente el trabajo con tuplas y su mutabilidad o hacerlas de solo lectura.

Ejemplos de errores reales debido al desconocimiento de los matices del tema.


Historia

Un desarrollador describió una función que retornaba una tupla [number, string], pero luego comenzó a agregar elementos al resultado a través de push. Esto llevó a una desincronización de tipos: el código posterior esperaba exactamente dos elementos con tipos definidos, pero recibió un arreglo de longitud variable, lo que provocó errores en tiempo de ejecución al desempaquetar valores y leer índices inexistentes.


Historia

Para almacenar un arreglo de valores de diferentes tipos, se utilizó un arreglo any[], considerando que era una solución universal. Como resultado, TypeScript dejó de verificar la corrección de tipos, y la lógica de la aplicación comenzó a "romperse" debido a conversiones de tipos incorrectas que no generaban errores de compilación.


Historia

En el proyecto, el arreglo se describía ya sea a través de tipo[], ya sea a través de Array<tipo> — pero en algunos lugares se permitía la declaración let arr: any[] (para trabajar "con cualquier cosa"). Debido a esto, aparecían conversiones incontroladas, la función aceptaba cualquier arreglo, lo que conducía a errores en tiempo de ejecución al intentar llamar a métodos incorrectos para elementos de diferentes tipos.