Typescript事件界面上的问题已扩展

时间:2019-04-23 14:02:20

标签: typescript interface extend

我正在尝试实现事件发射器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')

  1. 我无法获得已定义事件类型的参数的类型限制,例如,我只能在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时,我该怎么做才能使界面扩展工作,并得到参数限制和建议。

0 个答案:

没有答案