类型中缺少索引签名

塞巴斯蒂安奥尔森

我正在尝试制作一个类型安全的 EventEmitter,但是我不能强制传递给泛型的接口是类型EventMap而不是 TypeScript 抱怨的。

type EventHandler = () => void
type EventMap = Record<string, EventHandler>

interface EventListener {
  handler: EventHandler
  once: boolean
}

export class Emitter<Events extends EventMap> {
  private listeners = new Map<keyof Events, EventListener[]>()

  private addListener<E extends keyof EventMap>(type: E, listener: EventListener) {
    const listeners = this.listeners.get(type) || []
    this.listeners.set(type, [...listeners, listener])
  }

  @bind
  public on<E extends keyof EventMap>(type: E, handler: Events[E]) {
    this.addListener(type, { handler, once: false })
  }
}


interface TestEvents {
  test: (a: number) => void,
}

class Test extends Emitter<TestEvents> {}

给我

Type 'TestEvents' does not satisfy the constraint 'Record<string, EventHandler>'.
Index signature is missing in type 'TestEvents'.
提香·切尔尼科娃-德拉戈米尔

你需要限制它有点不同,你想要的所有键EventsEventHandlers不一定是Events有一个指数的签名。您可以使用以下内容:

type EventHandler = (...a: any[]) => void

interface EventListener {
    handler: EventHandler
    once: boolean
}

export class Emitter<Events extends Record<keyof Events, EventHandler>> {
    private listeners = new Map<keyof Events, EventListener[]>()

    private addListener<E extends keyof Events>(type: E, listener: EventListener) {
        const listeners = this.listeners.get(type) || []
        this.listeners.set(type, [...listeners, listener])
    }

    public on<E extends keyof Events>(type: E, handler: Events[E]) {
        this.addListener(type, { handler, once: false })
    }
}


interface TestEvents {
    test: (a: number) => void,
}

class Test extends Emitter<TestEvents> { }
new Test().on("test", a => a.toExponential) // a is number.

但是,这种方法存在问题,如果地图中有多个事件(您可能会),则打字稿将无法推断参数类型

interface TestEvents {
    test: (a: number) => void,
    test2: (a: number) => void,
}

class Test extends Emitter<TestEvents> { }
new Test().on("test", a => a.toExponential) // a is any

这是可以修复的,但类型变得更复杂,请参阅此处以获取非常相似的想法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

无法调用类型缺少呼叫签名的表达式

来自分类Dev

复合文字中缺少类型

来自分类Dev

Doxygen生成的PDF索引中缺少页码

来自分类Dev

jQuery HTML中缺少空格的字符索引

来自分类Dev

在函数类型签名中替换=>代替->

来自分类Dev

MXBean操作签名中的抽象类型

来自分类Dev

多维数组PHP中缺少索引

来自分类Dev

打字稿:扩展接口时类型中缺少索引签名

来自分类Dev

Typescript无法在索引签名中的通用方法上检测参数类型

来自分类Dev

打字稿:类型中缺少索引签名

来自分类Dev

C ++中的签名类型表示

来自分类Dev

类型中缺少索引签名-使用$ validators进行AngularJS + TypeScript验证

来自分类Dev

如何解决“类型中缺少索引签名”错误?

来自分类Dev

“字符串”类型的索引签名仅允许读取

来自分类Dev

SSMS中缺少添加索引箭头

来自分类Dev

Typescript-具有通用类型函数的索引签名

来自分类Dev

在索引中插入缺少的季度收入日期

来自分类Dev

对象[] | object []类型缺少'find(),foreach()'的调用签名

来自分类Dev

类型“ {}”缺少类型中的以下属性

来自分类Dev

在TypeScript中实现新的通用接口时出现错误“类型IFoo <T>需要构造签名,但类型Foo <T>缺少一个签名”

来自分类Dev

Agda中类型签名中的任意求值

来自分类Dev

无法调用类型缺少调用签名的表达式,而它有签名

来自分类Dev

无法调用类型缺少调用签名的表达式。类型没有兼容的调用签名

来自分类Dev

打字稿中的原型:元素隐式具有“任何”类型,因为类型“_BaseOption”没有索引签名

来自分类Dev

类型中缺少索引签名:为什么这是一个错误?

来自分类Dev

错误 - PerfectScrollbar : 无法调用类型缺少调用签名的表达式。“号码”类型没有兼容的呼叫签名

来自分类Dev

类型“{}”中缺少属性“containerComponent”

来自分类Dev

是否可以推断通用索引签名的类型?

来自分类Dev

如何使用任意字符串键声明类型化对象 - 缺少索引签名?

Related 相关文章

  1. 1

    无法调用类型缺少呼叫签名的表达式

  2. 2

    复合文字中缺少类型

  3. 3

    Doxygen生成的PDF索引中缺少页码

  4. 4

    jQuery HTML中缺少空格的字符索引

  5. 5

    在函数类型签名中替换=>代替->

  6. 6

    MXBean操作签名中的抽象类型

  7. 7

    多维数组PHP中缺少索引

  8. 8

    打字稿:扩展接口时类型中缺少索引签名

  9. 9

    Typescript无法在索引签名中的通用方法上检测参数类型

  10. 10

    打字稿:类型中缺少索引签名

  11. 11

    C ++中的签名类型表示

  12. 12

    类型中缺少索引签名-使用$ validators进行AngularJS + TypeScript验证

  13. 13

    如何解决“类型中缺少索引签名”错误?

  14. 14

    “字符串”类型的索引签名仅允许读取

  15. 15

    SSMS中缺少添加索引箭头

  16. 16

    Typescript-具有通用类型函数的索引签名

  17. 17

    在索引中插入缺少的季度收入日期

  18. 18

    对象[] | object []类型缺少'find(),foreach()'的调用签名

  19. 19

    类型“ {}”缺少类型中的以下属性

  20. 20

    在TypeScript中实现新的通用接口时出现错误“类型IFoo <T>需要构造签名,但类型Foo <T>缺少一个签名”

  21. 21

    Agda中类型签名中的任意求值

  22. 22

    无法调用类型缺少调用签名的表达式,而它有签名

  23. 23

    无法调用类型缺少调用签名的表达式。类型没有兼容的调用签名

  24. 24

    打字稿中的原型:元素隐式具有“任何”类型,因为类型“_BaseOption”没有索引签名

  25. 25

    类型中缺少索引签名:为什么这是一个错误?

  26. 26

    错误 - PerfectScrollbar : 无法调用类型缺少调用签名的表达式。“号码”类型没有兼容的呼叫签名

  27. 27

    类型“{}”中缺少属性“containerComponent”

  28. 28

    是否可以推断通用索引签名的类型?

  29. 29

    如何使用任意字符串键声明类型化对象 - 缺少索引签名?

热门标签

归档