我正在努力使我的代码更易读和简洁。
我当前遇到的最大问题是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]”
。
将事件名称的类型缩小到string
(如extract
)可能会有所帮助。
或者如果您只希望keyof
运算符的结果是字符串,请在tsconfig.json
中添加具有“keyofstringsonly”:true
的配置。