2016-07-13 2 views
2

Я использую машинопись, и я хочу сопоставить строку с типом, чтобы я мог создавать экземпляры определенного типа на основе строки, которую у меня есть.Стратегия - строка для типа в машинописном тексте

Я пишу node.js

Например - я получаю из БД значение «Диапазон» и для этого случая я хочу использовать мой класс «RangeFilter», но в случае значения «size» Я хочу использовать класс «SizeFilter». Все они наследуются от интерфейса «IFilter».

Так есть способ отображения (создание словаря) между значениями к типу

Так что может быть, как это

карта: {ключ: строки, значение: IFilter};

Вернуться новая карта [ "Диапазон"] // возвращает RangeFilter

+0

Возможный дубликат [Динамически загружая класс машинопись (отражения для машинописи)] (http://stackoverflow.com/questions/15338610/ dynamic-load-a-typescript-class-reflection-for -criptcript) – InferOn

+0

Поскольку я пишу node.js, у меня нет объекта окна, и я не могу выполнить поиск внутри него моего объекта –

+0

, так что, возможно, вы должны лучше аргумент ваш вопрос, извините – InferOn

ответ

2

Существует способ.
В основном все, что вам нужно знать, это тип класса MyClass: { new(): MyClass }.

Тогда вы можете сделать:

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

Спасибо! Много помогли –

Смежные вопросы