我正在尝试实现事件发射器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
的{{1}}:this.emit('eat', 'fish')
。
Argument of type '[string]' is not assignable to parameter of type 'Parameters<(AnimalEvents & Events)["eat"] & ((...args: any[]) => void)>'.
处获得类型限制...args[]
,而不能在AnimalEvents中定义的this.emit('eat', HERE)
处得到。 / li>
因此,当我输入food: string
时,我该怎么做才能使界面扩展工作,并得到参数限制和建议。