提问者:小点点

Typescript向EventEmitter添加类型


我正在努力使我的代码更易读和简洁。

我当前遇到的最大问题是EventEmitter类。每次创建使用EventEmitter的新类时,我都必须声明EventEmitter的所有函数,以使类更易于理解和使用。

例:

interface Hello {
    addListener(event: 'hi', listener: (message: string) => void): this;
    on(event: 'hi', listener: (message: string) => void): this;
    ...
}

class Hello extends EventEmitter {
    constructor() { super(); }
}

我四处寻找解决办法,但我找不到任何适合我的办法,所以我试着想出我自己的办法。

interface EventEmitterEvents {
    [event: string]: any[];
}

interface EventEmitterType<T extends EventEmitterEvents> extends EventEmitter {
    addListener<K extends keyof T>(event: K, listener: (...args: T[K]) => void): this;
    on<K extends keyof T>(event: K, listener: (...args: T[K]) => void): this;
    ...
}

class Hello extends EventEmitter implements EventEmitterType<{'hi': [string]}> { ... }

但是当我尝试实现EventEmitterType接口时,它会抛出一个错误

属性“添加侦听器”的类型不兼容

我发现,由于某种原因,在'add listener'和函数中,event类型被称为'string''symbol''number',这与eventemitter不兼容,在eventemitterEvents中,event的类型是'string'

问题:是否有任何方法可以解决这个问题,如果没有,是否有任何其他方法可以重新创建这个功能(不必键入所有这些函数)?

编辑:如果我将事件参数设置为“string”,它仍然会抛出错误,因为listener也与AddListener不兼容,它说“any[]”不能分配给类型“t[K]”


共1个答案

匿名用户

将事件名称的类型缩小到string(如extract)可能会有所帮助。

或者如果您只希望keyof运算符的结果是字符串,请在tsconfig.json中添加具有“keyofstringsonly”:true的配置。