Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.05.2015, 08:26
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Ковыряния typescript-а
Привет, ковыряю typescript и один вопрос чёт не гуглится: допустим такой код:
on(types: string|string[]|Object, fn: Function, context?: Object): Emitter {
        // types can be a view of types/handlers
        if (typeof types == 'object') {
            for (let type in <Object>types) {
                // we don't process space-separated events here for performance;
                // it's a hot path since Layer uses the on(obj) syntax
                this._on(type, types[type], fn);
            }

        }
        // ...
    }


здесь я кастанул `<Object>types`, иначе компилятор ругается. Если в этом блоке `types` придётся юзать несколько раз, то придётся каждый раз кастовать `Object`, что не удобно, либо написать как-то так:
let t = <Object>types;

и дальше юзать `t` вместо `types`. Так уже удобно, но на выходе генерится код с явно лишним присваиванием, как-то это не красиво, а хочется что-бы и результирующий код был нормальным.
Реально ли как-то чтобы и удобно было и без говнокода на выходе?
Ответить с цитированием
  #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.
Ответить с цитированием
  #3 (permalink)  
Старый 15.05.2015, 15:52
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от tsigel
используем механизм приведения типов (если позволяют данные)
а можно пример?

Сообщение от tsigel
либо (в вашем случае) делаем дополнительные служебные методы работающие с конкретным типом
ну да, вроде норм вариант.
Ответить с цитированием
  #4 (permalink)  
Старый 15.05.2015, 15:58
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Сообщение от Riim
а можно пример?
Ну например я писал свою простенькую библиотечку для работы с домом. Забавы ради. Она должна была работать как со строками(селекторами и версткой), так и с дом элементам, своими экземплярами, списками селекторов, списками дом элементов, и перемешанными этими списками. По сути все действия библиотеки работали с типом дом элемента, поэтому я написал механизм который каждый из этих типов приводит к массиву дом элементов.

Но это нужно когда у вас есть 3-4 типа данных с которыми вы постоянно и много работаете, в случаях с событиями это не имеет смысла.
Ответить с цитированием
  #5 (permalink)  
Старый 15.05.2015, 22:50
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Неприличными словами можно выражаться? Спасибо.

Полиформизм.
Ответить с цитированием
  #6 (permalink)  
Старый 16.05.2015, 09:41
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от kostyanet
Полиформизм.
Костян, ты новое умное слово чтоль изучил? ))
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TypeScript vs ES6 caetus Общие вопросы Javascript 17 18.03.2016 12:37
TypeScript for Large App Angularjs kodermax Angular.js 1 25.03.2015 22:58
Как бы скоро не пришлось писать на Dart, TypeScript ... Gozar Оффтопик 93 21.03.2014 15:46
Typescript vs Dart x-yuri Оффтопик 91 15.10.2012 00:32