2017-09-20 4 views
0

dactylographiée, je peux faire les deux choses suivantes:Est-il possible de définir un alias de type union à partir d'un tableau de littéraux de chaîne dans TypeScript?

type ToolboxSpaceType = 'screw'|'hammer'|'screwdriver'; // 1 

ProxyProperties = ['screw', 'hammer', 'screwdriver']; // 2 

class Toolbox { 
    [key: ToolboxSpaceType]: ToolboxSpace; 
} 

let proxyHandler = { 
    get(target: Toolbox, prop: PropertyKey, receiver: any) { 
    if (ProxyProperties.include(prop) { 
     //...do something special... 
    } 
    } 
} 
let personalToolbox = new Toolbox(); 
let personalToolboxProxy = new Proxy(personalToolbox, proxyHandler) 

Je voudrais être en mesure de générer le ToolboxSpaceType à partir du tableau ProxyProperties de chaînes. Existe-t-il un moyen de le faire dans TypeScript?

+0

Ma réponse [ici] (https://stackoverflow.com/a/45486495/2887218) est pertinente; Je vais le peaufiner dans une réponse à cette question. – jcalz

Répondre

0

Note: le code tel que présenté dans votre message a des problèmes et ne compile pas comme écrit. La réponse suivante ne concerne que les deux premières lignes concernant le type ToolboxSpaceType et le tableau ProxyProperties, puisque c'est ce que vous demandez.


Vous pouvez le faire. Il est préférable d'ajouter une fonction d'assistance afin que votre tableau ne soit pas déduit comme string[]. La fonction suivante force le type d'élément de tableau à déduire comme une union de littéraux de chaîne:

function literalArray<K extends string>(args: K[]): K[] { 
    return args; 
} 

maintenant ProxyProperties est inférée comme ('screw'|'hammer'|'screwdriver')[]:

const ProxyProperties = literalArray(['screw', 'hammer', 'screwdriver']); 

et vous pouvez calculer l'union en extrayant son type d'élément :

type ToolboxSpaceType = typeof ProxyProperties[number]; 

En an answer to another question J'ai recommandé une fonction d'assistance (tuple() dans tuple.ts) pour déduire les types d'uplets, ce qui pourrait être encore mieux pour vous, puisque ProxyProperties contient les littéraux exactement une fois dans un ordre connu. Vous souhaitez l'utiliser comme ceci:

const ProxyProperties = tuple('screw', 'hammer', 'screwdriver'); 
//inferred as type ["screw", "hammer", "screwdriver"] 

type ToolboxSpaceType = typeof ProxyProperties[number]; // still works 

Hope qui aide; bonne chance!