正在调度自定义事件

Dispatching custom events

本文关键字:事件 自定义 调度      更新时间:2023-09-26

我的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);

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

var myEvent = new CustomEvent();

是正确的。

根据Chrome 27和Aurora 24.02的说法,后者是错误的,因为"缺少论据"

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

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

或者,我只是编辑了lib.d.ts,在IDE重新启动后,它为我提供了更新的签名。尽管如此,我还是不想以这种方式篡改第三方文件。

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

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

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

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

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

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

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

在等待InternetExplorer/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。

我最终完成了所有这些:

  • 在生成时使用--nolib选项
  • 添加lib.d.ts的本地副本
  • 修补预期的构造函数签名
  • 为IE添加polyfill<=11由MDN提议
var event = <CustomEvent>(new (<any>CustomEvent)('specifiedEvent'))

可能是一个解决方案。好看又狡猾。