Búsqueda de sitios web

typescript - Array genérico para devolver índices tipados


Podría ser una mala pregunta o incluso no ser posible, pero he estado rompiéndome la cabeza con esto durante un tiempo y no puedo resolverlo. ¡Gracias de antemano!

El genérico T crea un tipo de unión:

const arrayToArray = <T>(values: T[]) => values;

Cuando uso la función:

const result = arrayToArray([1, 'hi', 3]);

Crea el tipo:

const result: (string | number)[]

Estoy buscándolo para crear:

const result: [number, string, number]

Espero que 'one' y 'three' devuelvan un error de tipo porque no son números.

const useResultType: typeof result = ['one', 'two', 'three'];

Respuesta #1

Quieres que se infieran tuplas a partir del literal de arreglo, hay dos formas de convencer al compilador de hacer esto:

Uso de tuplas en parámetros rest. Esto eliminó el literal de array de la llamada:

const arrayToArray = <T extends any[]>(...values: T) => values;

const result = arrayToArray(1, 'hi', 3); //[number, string, number]

Usando una unión de restricción de tupla y arreglo para indicar al compilador que quieres una unión. Esto preserva pasar el parámetro como un arreglo:

const arrayToArray = <T extends [any] | any[]>(values: T) => values;

const result = arrayToArray([1, 'hi', 3]); // [number, string, number]

O si quieres una tupla de solo lectura en la 3.4 (todavía no lanzada) puedes usar directamente una afirmación as const:

const result = [1, 'hi', 3]  as const; // readonly [number, string, number]