ACTUALIZACIÓN Feb 2019
En TypeScript 3.4, que debería lanzarse en marzo de 2019 , será posible decirle al compilador que infiera el tipo de una tupla de literales como una tupla de literales , en lugar de, por ejemplo, string[]
utilizando la as const
sintaxis . Este tipo de afirmación hace que el compilador infiera el tipo más estrecho posible para un valor, incluido hacer todo readonly
. Debe tener un aspecto como este:
const list = ['a', 'b', 'c'] as const;
type NeededUnionType = typeof list[number];
Esto evitará la necesidad de una función auxiliar de cualquier tipo. ¡Buena suerte de nuevo a todos!
ACTUALIZACIÓN Julio 2018
Parece que, a partir de TypeScript 3.0, será posible que TypeScript infiera automáticamente tipos de tuplas . Una vez que se lanza, la tuple()
función que necesita se puede escribir sucintamente como:
export type Lit = string | number | boolean | undefined | null | void | {};
export const tuple = <T extends Lit[]>(...args: T) => args;
Y luego puedes usarlo así:
const list = tuple('a','b','c');
type NeededUnionType = typeof list[number];
¡Espero que funcione para la gente!
ACTUALIZACIÓN Diciembre de 2017
Desde que publiqué esta respuesta, encontré una manera de inferir tipos de tuplas si está dispuesto a agregar una función a su biblioteca. Consulte la función tuple()
en tuple.ts . Al usarlo, puede escribir lo siguiente y no repetirlo:
const list = tuple('a','b','c');
type NeededUnionType = typeof list[number];
¡Buena suerte!
ORIGINAL Julio de 2017
Un problema es que el literal ['a','b','c']
se inferirá como tipo string[]
, por lo que el sistema de tipos se olvidará de los valores específicos. Puede forzar al sistema de tipos a recordar cada valor como una cadena literal:
const list = ['a' as 'a','b' as 'b','c' as 'c'];
O, quizás mejor, interprete la lista como un tipo de tupla:
const list: ['a','b','c'] = ['a','b','c'];
Esta es una repetición molesta, pero al menos no introduce un objeto extraño en tiempo de ejecución.
Ahora puede obtener su sindicato así:
type NeededUnionType = typeof list[number];
Espero que ayude.