我有一个类似于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时,我传递一个包含所有预期类型的类型参数?
创建后是否可以动态地执行此操作?
答案 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);