3

我的 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。此外,更正了虚构的事件类型名称)

4

3 回答 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。

于 2013-07-10T15:59:12.937 回答
1

我最终做了所有这些:

  • 在构建时使用 --nolib 选项
  • 添加 lib.d.ts 的本地副本
  • 修补预期的构造函数签名
  • 按照MDN的建议为 IE <= 11 添加 polyfill
于 2013-07-10T15:21:14.950 回答
0
var event = <CustomEvent>(new (<any>CustomEvent)('specifiedEvent'))

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

于 2013-12-24T09:39:47.103 回答