Mise à JOUR Février 2019
Dans Tapuscrit 3.4, qui devrait être publié en Mars 2019 , il sera possible de dire au compilateur de déduire le type d'un n-uplet de littéraux comme un n-uplet de littéraux, au lieu de, disons, string[]
, à l'aide de la as const
de la syntaxe. Ce type d'affirmation, le compilateur en déduire le plus étroit possible pour une valeur, y compris de faire tout readonly
. Il devrait ressembler à ceci:
const list = ['a', 'b', 'c'] as const; // TS3.4 syntax
type NeededUnionType = typeof list[number]; // 'a'|'b'|'c';
Cela permettra d'éviter le recours à une fonction d'assistance de toute nature. Bonne chance à tous!
Mise à JOUR en juillet 2018
Il ressemble, en commençant par Tapuscrit 3.0, il sera possible pour le Tapuscrit pour automatiquement déduire tuple types. Une fois relâchée, tuple()
de la fonction dont vous avez besoin peut être succinctement écrite comme suit:
export type Lit = string | number | boolean | undefined | null | void | {};
export const tuple = <T extends Lit[]>(...args: T) => args;
Et puis vous pouvez l'utiliser comme ceci:
const list = tuple('a','b','c'); // type is ['a','b','c']
type NeededUnionType = typeof list[number]; // 'a'|'b'|'c'
Espérons que fonctionne pour les gens!
Mise à JOUR décembre 2017
Depuis que j'ai posté cette réponse, j'ai trouvé un moyen de déduire tuple types si vous êtes prêt à ajouter une fonction à votre bibliothèque. Découvrez la fonction tuple()
en n-uplet.ts. En l'utilisant, vous êtes en mesure d'écrire la suite et de ne pas répéter vous-même:
const list = tuple('a','b','c'); // type is ['a','b','c']
type NeededUnionType = typeof list[number]; // 'a'|'b'|'c'
Bonne chance!
ORIGINAL juillet 2017
Un problème est que les littérale ['a','b','c']
sera déduit comme étant de type string[]
, de sorte que le type de système d'oublier les valeurs spécifiques. Vous pouvez forcer le type de système à se souvenir de chaque valeur comme une chaîne littérale:
const list = ['a' as 'a','b' as 'b','c' as 'c']; // infers as ('a'|'b'|'c')[]
Ou, peut-être mieux, d'interpréter la liste comme un tuple de type:
const list: ['a','b','c'] = ['a','b','c']; // tuple
Ce qui est gênant pour la répétition, mais au moins il n'a pas d'introduire un parasite de l'objet au moment de l'exécution.
Vous pouvez maintenant obtenir votre union comme ceci:
type NeededUnionType = typeof list[number]; // 'a'|'b'|'c'.
Espérons que cela aide.