Показать сообщение отдельно
  #2 (permalink)  
Старый 15.05.2015, 14:42
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Riim,
Если вы, как и многие другие, уперлись в вялую типизацию событий, то я рекомендую посмотреть в сторону типизированных событий. Что-то типа https://github.com/darkartur/events

Это во первых сильно быстрее работает, во вторых нет магических констант типа имен событий + идеальная типизация.

Тогда создание события будет выглядеть примерно так:
this.onRender = new Event();

Запуск события:
this.onRender.trigger(params);

Подписка на события:
this.onRender.on(handler);


Касательно конкретно вашего вопроса, мы в методах принимающих параметры разного типа либо используем механизм приведения типов (если позволяют данные), либо (в вашем случае) делаем дополнительные служебные методы работающие с конкретным типом.

Ну и в данном конкретном случае 1 ветвление можно убрать пользуя итераторы типа lodash или underscore у которых одинаковый интерфейс на перебор массива/объекта.

Пример:
public on(types: string|string[]|Object, fn: Function, context?: Object): Emitter {
  if (Array.isArray(types)) {
    types.forEach((type:string) => {this.onString(type, fn, context)});    
  } else if (typeof types == "object") {
    this.onObject(<Object>type, fn, context);
  } else {
    this.onString(type, fn, context)
  }
  return this;
}

private onString(types: string, fn: Function, context?: Object) {
  ...
}

private onObject(types: Object, fn: Function, context?: Object) {
  for (var key in types) {
    if (types.hasOwnProperty(key)) {
      this.onString(key, types[key], this);
    }
  } 
}

Последний раз редактировалось tsigel, 15.05.2015 в 14:58.
Ответить с цитированием