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]
