Búsqueda de sitios web

javascript - Typescript restringir la longitud máxima del Array


Básicamente, quiero un tipo de arreglo con una longitud máxima de 4. No fue tan fácil, no pude encontrar cómo se puede implementar esta verificación en TypeScript. ¿Alguien puede ayudarme? Algo como esto:

const a = [item1, item2, item3, item4, *item5*] -> array has a maximum length of 4

¡Gracias!

Respuesta #1

TypeScript tiene tipos de arreglos de "longitud fija" llamados tuplas. Puedes usar elementos de tupla opcionales para representar un arreglo cuya longitud esté en algún rango hasta un máximo de 4. Y recomendaría usar una tupla readonly si quieres intentar mantener la restricción de longitud:

type ArrayOfMaxLength4 = readonly [any?, any?, any?, any?];

const a: ArrayOfMaxLength4 = [item1, item2, item3, item4, item5]; // error!
//    ~ <--  Source has 5 element(s) but target allows only 4
const b: ArrayOfMaxLength4 = [item1, item2, item3]; // okay

Puse “longitud fija” entre comillas porque las tuplas se representan y se tipan como un tipo especial de Array, que tiene métodos como push() que pueden cambiar la longitud. Nada te impide pushar un valor al final de una tupla.

const c: [number, string] = [1, "a"];
c.push(2); // oops
c.unshift("OOPS"); // big oops, totally wrong value in tuple
console.log(c); // ["OOPS", 1, "a", 2]

Hubo una solicitud para evitar que esto sucediera en microsoft/TypeScript#6325, pero fue rechazada. Una forma de hacer más difícil violar tu restricción es usar un ReadonlyArray o una tupla readonly que no exponga ningún método que te permita modificar el arreglo. Esto podría ser excesivo si deseas modificar los elementos sin cambiar la longitud del arreglo o los tipos de los elementos, pero al menos te advierte sobre cosas como push():

b.push(5); // error
//~~~~ <-- Property 'push' does not exist on type 'ArrayOfMaxLength4'

Enlace de Playground al código

Artículos relacionados