当前位置: 首页 > 知识库问答 >
问题:

Typescript向EventEmitter添加类型

郭乐湛
2023-03-14

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

我当前遇到的最大问题是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个答案

闻慎之
2023-03-14

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

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

 类似资料:
  • 我看到过一些关于的博客,这些博客似乎可以很好地为类添加行为。 但是,如果我有一个并且我要怎么办?作为一个case类,我不能扩展它(不推荐/强烈不鼓励从case类继承)。这些皮条客模式是否允许我将数据添加到case类中?

  • 我想在表的第二列中追加 。输出应为 我不想使用,因为我需要在我的实际问题中追加嵌套的div。我制作了同样的小示例。JsFiddle

  • 我正在使用Java代理和Javassist向一些JDK类添加一些日志记录。实际上,当系统加载一些TLS类时,Javassist会向它们添加一些额外的字节码,以帮助我调试一些连接问题。 问题是,考虑到这个类包含在代理jar中: 在我的代理的转换方法中,假设我试图使用javassist调用该类: 你认为这行得通,但我得到了这个: 有没有办法将该类[]添加到应用程序的类路径中?

  • 问题内容: 我有五个按钮,是动态创建的。我的目标是:单击任何按钮以向其中添加活动类,当然还有其他任何人可以通过该活动类将其删除。我该如何实现? 问题答案: 您需要将状态引入组件并在事件处理程序中进行设置。例如render方法的输出: 事件处理程序(元素方法):

  • 我正在使我的put方法在我的控制器类,但我有很多不同的属性,我想设置,有一些插件,我可以用来填写我的所有设置器

  • 我有一个,我想为它设置。 我知道我可以用div包装它,并控制该div的子级的CSS,但如果可能的话,我希望避免多余的包装。 PrimeFaces版本:3.5。