如何为EventEmitter之类的事件有效负载分配TypeScript类型?

时间:2018-11-29 01:20:15

标签: typescript eventemitter

我有一个类似于Node的EventEmitter的类(它甚至可以是同一类)。

如何以可以为每个不同的事件名称指定回调类型的方式键入它?

例如,我希望"foo"的负载类型为number,事件"bar"的负载类型为string,如下所示: :

const emitter = /* get emitter from somewhere. And how would the type definition look like? */

emitter.on('foo', payload => {
  /* type of payload is number, enforced by TypeScript */
  testNumber('foo') // TS error, 'foo' is not a number
  testNumber(payload) // it works, payload is a number
})

emitter.on('bar', payload => {
  /* type of payload is string, enforced by TypeScript */
  testString(5) // TS error, 5 is not a string
  testString(payload) // it works, payload is a string
})

function testNumber( value: number ) {}
function testString( value: string ) {}

我们将如何定义EventEmitter声明,以便可以定义事件及其类型,然后让用户通过正确的类型检查来使用这些事件?

也许有一种方法可以定义EventEmitter的类型,以便在我创建EventEmitter时,我传递一个包含所有预期类型的​​类型参数?

创建后是否可以动态地执行此操作?

1 个答案:

答案 0 :(得分:0)

我将从以下内容开始:

interface Events {
  foo: number;
}

interface EventEmitter<T> {
  on<K extends keyof T>(s: K, listener: (v: T[K]) => void);
  emit<K extends keyof T>(s: K, request: T[K]): any;
}

declare const emitter: EventEmitter<Events>;

emitter.on('foo', (payload) => {
  console.log(payload);
});

emitter.emit('foo', 1);

这里是example on TS Playground

相关问题