Я пытаюсь применить определения событий в моем коде, используя интерфейс и класс с тем же именем, что и в следующем примере:
export declare interface ClientEvents {
on(event: "event_name", data: (data: string) => void) : this;
emit(event: "event_name", data: string) : boolean;
}
export class ClientEvents extends EventEmitter {}
Это хорошо работает само по себе для завершения IDE и обеспечения того, чтобы только эти события передаются объектом события.
Проблема возникает, когда я пытаюсь расширить этот интерфейс, как показано ниже:
export declare interface SpecificClientEvents extends ClientEvents {
on(event: "child_event_name", data: (data: string) => void) : this;
emit(event: "child_event_name", data: string) : boolean;
}
export class SpecificClientEvents extends ClientEvents {}
Я получаю следующие ошибки:
TS2430: Interface 'SpecificClientEvents' incorrectly extends interface 'ClientEvents'.
для интерфейса
TS2415: Class 'SpecificClientEvents' incorrectly extends base class 'ClientEvents'.
для класса
Я также попытался разделить класс и интерфейс на отдельные определения, как показано в следующем примере:
export interface ClientEventDefinitions {
on(event: "event_name", data: (data: string) => void) : this;
emit(event: "event_name", data: string) : boolean;
}
export class ClientEvents extends EventEmitter implements ClientEventDefinitions {}
export interface SpecificClientEventDefinitions {
on(event: "child_event_name", data: (data: string) => void) : this;
emit(event: "child_event_name", data: string) : boolean;
}
export class SpecificClientEvents extends ClientEvents implements SpecificClientEventDefinitions {}
Это компилируется нормально, но моя IDE не не обнаруживать имена событий, как это происходит, когда класс и интерфейс имеют одно и то же имя. Это вероятно проблема с IDE? Это не работает как для родительского, так и для дочернего классов.
Я также могу выполнить new SpecificClientEvents().emit("an event that isn't defined");
без ошибок, используя 2-й пример.
EDIT:
Если я вручную добавляю методы из родительского интерфейса в дочерний интерфейс, это работает абсолютно нормально. Но какой смысл расширять родительский объект, если мне нужно добавить методы вручную?
РЕДАКТИРОВАТЬ 2:
Я решил использовать строгий пакет генератора событий со следующим кодом для удовлетворения моих потребностей
export type ClientEventEmitter = StrictEventEmitter<EventEmitter, ClientEvents>;
export interface ClientEvents {
event_name: (data: string) => void;
}
export type SpecificClientEventsEmitter = StrictEventEmitter<EventEmitter, SpecificClientEvents>;
export interface SpecificClientEvents extends ClientEvents {
child_event_name: (data: string) => void;
}