2016-07-13 2 views
2

J'utilise tapuscrit, et je veux mapper une chaîne à un type afin que je puisse faire des instances de certain type en fonction d'une chaîne que j'ai.Stratégie - Chaîne à taper en caractères dactylographiés

Je vous écris pour Node.js

Par exemple - j'obtenir à partir d'une base de données de la valeur « plage » et ce cas, je veux utiliser ma classe « RangeFilter », mais dans le cas de la valeur "size" Je veux utiliser la classe "SizeFilter". Ils héritent tous de l'interface "IFilter".

Ainsi est-il un moyen de la carte (créer un dictionnaire) entre les valeurs du type

Il pourrait être comme ça

map: {key: string, valeur: IFilter};

Retour nouvelle carte [ "plage"] // retourne RangeFilter

+0

double possible de [charger Dynamiquement une classe dactylographiée (réflexion pour tapuscrit)] (http://stackoverflow.com/questions/15338610/ dynamiquement-chargement-une-classe-typographique-reflexion-pour-dactylographier) – InferOn

+0

Puisque j'écris à node.js je n'ai pas d'objet window, et je ne peux pas chercher à l'intérieur de mon objet –

+0

alors peut-être que vous devriez mieux argument votre question, désolé – InferOn

Répondre

2

Il y a une façon.
Fondamentalement tout ce que vous devez savoir est que le type d'une classe MyClass est: { new(): MyClass }.

Ensuite, vous pouvez faire:

interface IFilter {} 

type FilterConstructor = { new(): IFilter }; 

class RangeFilter implements IFilter {} 

class SizeFilter implements IFilter {} 

let ctors: { [key: string]: FilterConstructor } = {}; 
ctors["range"] = RangeFilter; 
ctors["size"] = SizeFilter; 

function factory<T extends IFilter>(key: string): T { 
    let ctor = ctors[key]; 

    return ctor == null ? null : new ctor() as T; 
} 

let rangeFilter: RangeFilter = factory("range"); 

(code in playground)

+0

Merci! A beaucoup aidé –