Events TypeScript:EventEmitter子类事件的专用签名

Events TypeScript:EventEmitter子类事件的专用签名,events,typescript,overloading,typescript1.8,Events,Typescript,Overloading,Typescript1.8,我有一个基类EventEmitter,它有on方法来绑定特定事件的处理程序: 类事件发射器{ 打开(事件:字符串,处理程序:函数){ /*在内部添加处理程序*/ } 受保护的发射(事件:字符串,…args){ /*调用所有侦听事件的处理程序*/ } } 现在我有了各种各样的子类,它们可以用不同的参数发出不同的事件。我想“声明”该特定类可以发出哪些事件: class MyClass扩展了EventEmitter{ on(事件:'event1',处理程序:(arg1:number)=>void):

我有一个基类
EventEmitter
,它有
on
方法来绑定特定事件的处理程序:

类事件发射器{
打开(事件:字符串,处理程序:函数){
/*在内部添加处理程序*/
}
受保护的发射(事件:字符串,…args){
/*调用所有侦听事件的处理程序*/
}
}
现在我有了各种各样的子类,它们可以用不同的参数发出不同的事件。我想“声明”该特定类可以发出哪些事件:

class MyClass扩展了EventEmitter{
on(事件:'event1',处理程序:(arg1:number)=>void):void;
on(事件:'event2',处理程序:(arg1:string,arg2:number)=>void:void;
}
因此,我的子类可能会发出事件
event1
event2
,但这似乎不是正确的指定方式。TypeScript(tsc 1.8)包含以下内容:

error TS2415: Class 'MyClass' incorrectly extends base class 'EventEmitter'.
  Types of property 'on' are incompatible.
Type '(event: "event1", handler: (arg1: number) => void) => void' is not assignable to type '(event: string, handler: Function) => void'.
  Type '(event: "event1", handler: (arg1: number) => void) => void' provides no match for the signature '(event: string, handler: Function): void'
error TS2382: Specialized overload signature is not assignable to any non-specialized signature.
error TS2391: Function implementation is missing or not immediately following the declaration.
那么,指定类可以发出的事件的预期方式是什么

编辑:我找到了我要查找的内容的名称:。然而,它似乎只适用于接口,而不适用于新的TypeScript代码

现在,我发现2015年也存在同样的问题,但解决方案看起来并不完全正确。那么,今天还有其他的打字方式吗

指定类可以发出的事件的预期方式是什么

与其使用包含所有类型的单个事件流,不如为每种类型使用单独的事件流

这是一个我称之为
TypedEvent
的概念。使用它的一个示例项目是

实施:

下面是一个示例用法:

export let errorsUpdated=new TypedEvent();
//发射:
errorsUpdated.emit({}/*这将被类型检查*/);
//消费:
errorsUpdated.on((x)=>null);//x具有正确的推断类型

这可能是一种方法,但似乎是另一种风格。我想修改node.js(
instance.on(eventName,handler)
)和HTML DOM(
element.addEventListener(eventName,handler)
)的现有样式。标准node.js样式的编写并没有考虑静态类型检查。它依赖于文档,而不是代码时分析,并且在typescript中的建模没有那么好?如果我理解正确,我应该为每个可能的事件定义一个事件子类。我的模块不是外部的,我的类共享同一名称空间。两个类可能发出“event1”/
Event1Event
,但根据发出它的类的不同,它们具有不同的属性。我应该帮助你。
export let errorsUpdated = new TypedEvent<ErrorsUpdate>();
// emit: 
errorsUpdated.emit({} /* this will be type checked */);
// consume:
errorsUpdated.on((x)=>null); // x has the correct inferred type