Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
т.к. все объекты это функции, а функции объекты
({})() // TypeError: object is not a function
public MessagesLoaded: Events.Event<Events.ICallback<string[]>, string[]>
= new Events.Event<Events.ICallback<string[]>, string[]>();
у меня волосы становятся дыбом.class Event
-> @Callbacks = []
Add : ->
Callback: @Callbacks[*] = it
Event: @
Unsubscribe: @Remove.bind @,it
Remove : !(callback)-> @Callbacks .= filter (!=callback)
Trigger : !(options,context)-> for @Callbacks => ..apply context,options
public messagesLoaded = new Event<string[]>();export class Event<Delegate extends ICallback<Options>, Options>interface IEvent<Data> { on(fn:(Data) => boolean): ISubscribe { } trigger(d: Data): boolean { } }fn:(Data) => boolean это не что иное, как вынесенный мной наружу ICallback записанный анонимно. Ваша запись короче и имеет полное право на жизнь, если мы гарантированно больше нигде не будем использовать этот тип callback'а. Если же нам надо, чтобы сигнатуры callback'ов разных событий были строго одинаковы по той или иной причине, то нам нужно их типизировать делегатом, иначе мы можем получить неявные последствия при рефакторинге в виде расхождений сигнатур, что при необязательных параметрах или параметрах типа any может иметь сложноуловимые последствия. Тут уже возникает синтаксическая избыточность или я просто не нашел способа более короткой записи.export interface ICallback<ArgType>
{
(arg: ArgType, context?: any);
}
export interface ICallbackDesc<ArgType>
{
Callback: ICallback<ArgType>;
Subscriber: any;
}
export class Event<ArgType>
{
private Callbacks: ICallbackDesc<ArgType>[] = [];
public Subscribe(callback: ICallback<ArgType>, subscriber: any): ITypedSubscription<ArgType>
{
//Выполняем работу
}
public Unsubscribe(callback: ICallback<ArgType>): void
{
//Выполняем работу
}
public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any)
{
//Выполняем работу
}
}
/** Базовый интерфейс подписки на событие. Минимальная функциональность. Можем просто отписаться и все. */
export interface ISubscription
{
Unsubscribe: { (): void };
}
/** Типизированная версия. Включает ссылки на событие и callback */
export interface ITypedSubscription<ArgType> extends ISubscription
{
Callback: ICallback<ArgType>;
Event: Event<ArgType>;
}
Построение масштабируемых приложений на TypeScript. Часть 2.5 — Работа над ошибками и делегаты