Я пытаюсь реализовать API генератора событий, и я хочу, чтобы дочерний класс мог автоматически наследовать родительские интерфейсы событий. Вот мой код:
class Emitter<Events = {}> {
emit<N extends keyof Events>(name: N, ...args: Parameters<Events[N] & ((...args: any[]) => void)>) {}
}
interface AnimalEvents {
eat: (food: string) => void
}
class Animal<Events> extends Emitter<AnimalEvents & Events>{
constructor() {
super()
this.emit('eat', 'fish')
}
}
interface CatEvents {
miaow: (whom: string) => void
}
class Cat<Events> extends Animal<CatEvents & Events>{
constructor() {
super()
this.emit('eat', 'fish')
this.emit('miaow', 'me')
}
}
Две проблемы, которые я получил: 1. Ошибкав fish
из this.emit('eat', 'fish')
: Argument of type '[string]' is not assignable to parameter of type 'Parameters<(AnimalEvents & Events)["eat"] & ((...args: any[]) => void)>'.
.
Я не могу получить ограничение типа аргументов для определенного типа события, например, я могу получить только ограничение типа
...args[]
при
this.emit('eat', HERE)
, но не
food: string
Я определил в AnimalEvents.
Итак, что я могу сделать, чтобы интерфейс расширял работу, и получил ограничения аргументов и предложения при вводе this.emit(name, ...)
.