调度自定义事件

时间:2013-07-10 13:31:24

标签: javascript typescript

我的VS 2012 Update 3中安装了typescript编译器的0.9.0.1版本。

我想调度一个自定义事件,但是在lib.d.ts中声明的环境变量不会公开预期的构造函数签名。

当我使用

var myEvent = new CustomEvent("my:event:type", { detail: { some: "data"} });
window.dispatchEvent(myEvent);

类型脚本编译器抱怨,因为据他说,只有

var myEvent = new CustomEvent();

是对的。

根据Chrome 27和Aurora 24.02,由于“缺少参数”

,后者是错误的

MDN还列出了实际上正确但不能用于打字的构造函数签名。

我现在的想法是将已知正确的构造函数签名添加到环境变量声明中,但不接触附带的lib.d.ts文件。这在技术上是否可行?我无法为它提出正确的语法,语言规范没有提到如何合并两个这样的声明。

或者,我只是编辑了lib.d.ts,在重新启动IDE之后,我提供了更新的签名。不过,我宁愿不以这种方式篡改第三方文件。

最后,是否有一些其他机制我(sh | c)可以用来编写调度自定义事件的类型脚本代码?

(更新:重新启动IDE正确重新加载lib.d.ts。另外,更正了虚构的事件类型名称)

3 个答案:

答案 0 :(得分:3)

这不属于lib.d.ts的原因是Internet Explorer在IE10中不支持此对象。

如果CustomEvent定义纯粹是一个接口,那么你就可以扩展它:

interface CustomEvent {
    new(eventType: string, data: {});
}

但是CustomEvent构造函数实际上是在变量声明中定义的,你不能扩展它:

declare var CustomEvent: {
    prototype: CustomEvent;
    new(): CustomEvent;
}

在等待Internet Explorer / TypeScript库更新时,您可以使用此(讨厌的)解决方法来获取自定义事件。

class StandardsCustomEvent {
    static get(eventType: string, data: {}) {
        var customEvent = <any>CustomEvent;
        var event = new customEvent(eventType, data);
        return <CustomEvent> event;
    }
}

var x = StandardsCustomEvent.get("myevent",  { detail: { some: "data"} });

这会修复您的编译器警告 - 但不会使其在IE10或更早版本中运行 - 您需要进行填充。

答案 1 :(得分:1)

我最终完成了所有这些:

  • 在构建
  • 上使用--nolib选项
  • 添加lib.d.ts
  • 的本地副本
  • 修补预期的构造函数签名
  • MDN
  • 的建议为IE&lt; = 11添加polyfill

答案 2 :(得分:0)

var event = <CustomEvent>(new (<any>CustomEvent)('specifiedEvent'))

可能是一个解决方案。好看又棘手。