分派自定义事件

3

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

我想要分派一个自定义事件,但是在lib.d.ts中声明的环境变量没有暴露出预期的构造函数签名。

当我使用以下代码:

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

由于TypeScript编译器认为,只有

var myEvent = new CustomEvent();

这是正确的。

后者在Chrome 27和Aurora 24.02中是错误的,因为它“缺少参数”。

MDN还列出了实际上是正确的但不适用于TypeScript的构造函数签名。

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

或者,我可以直接编辑lib.d.ts文件,在IDE重新启动后,即可提供更新的签名。尽管如此,我仍然不愿以这种方式修改第三方文件。

最后,有没有其他机制可以使用来编写分派自定义事件的TypeScript代码?

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

3个回答

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或更早版本中工作 - 您需要使用polyfill。


定义一个TypeScript类型,其构造函数不返回该类型的对象确实很糟糕... - Arne

1
我最终做了以下所有事情:
  • 在构建时使用 --nolib 选项
  • 添加 lib.d.ts 的本地副本
  • 补丁预期的构造函数签名
  • 按照 MDN 建议,添加 IE <= 11 的 polyfill

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

可能是一个解决方案。外观漂亮,有些棘手。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接