Проблемы с интерфейсом событий машинописи расширяются - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь реализовать 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, ...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...