У меня есть базовый класс EventEmitter
, в котором есть метод on
для привязки обработчиков к определенным событиям:
class EventEmitter {
on(event: string, handler: Function) {
/* add handler internally */
}
protected emit(event: string, ...args) {
/* call all handlers listening on event */
}
}
Теперь у меня есть разные подклассы, которые могут генерировать разные события с разными аргументами. Я хотел бы «объявить», какие события могут быть созданы этим конкретным классом:
class MyClass extends EventEmitter {
on(event: 'event1', handler: (arg1: number) => void): void;
on(event: 'event2', handler: (arg1: string, arg2: number) => void): void;
}
Таким образом, мой подкласс может генерировать события event1
и event2
, но это не кажется правильным способом указания. TypeScript (tsc 1.8) сочетается:
error TS2415: Class 'MyClass' incorrectly extends base class 'EventEmitter'.
Types of property 'on' are incompatible.
Type '(event: "event1", handler: (arg1: number) => void) => void' is not assignable to type '(event: string, handler: Function) => void'.
Type '(event: "event1", handler: (arg1: number) => void) => void' provides no match for the signature '(event: string, handler: Function): void'
error TS2382: Specialized overload signature is not assignable to any non-specialized signature.
error TS2391: Function implementation is missing or not immediately following the declaration.
Итак, каков предполагаемый способ указать события, которые мой класс может генерировать?
РЕДАКТИРОВАТЬ: я нашел имя того, что искал: Специальные подписи. Однако похоже, что он предназначен только для интерфейсов, а не для нового кода TypeScript.
Теперь я нашел еще один вопрос о том же выпуск от 2015 года, однако решение там выглядит не совсем правильным. Итак, есть ли сегодня другие способы сделать это в TypeScript?