Ковыряния 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`. Так уже удобно, но на выходе генерится код с явно лишним присваиванием, как-то это не красиво, а хочется что-бы и результирующий код был нормальным. Реально ли как-то чтобы и удобно было и без говнокода на выходе? |
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); } } } |
Цитата:
Цитата:
|
Цитата:
Но это нужно когда у вас есть 3-4 типа данных с которыми вы постоянно и много работаете, в случаях с событиями это не имеет смысла. |
Неприличными словами можно выражаться? Спасибо.
Полиформизм. |
Цитата:
|
Часовой пояс GMT +3, время: 21:32. |