【问题标题】:expand Typescript definition for window object展开窗口对象的 Typescript 定义
【发布时间】:2016-05-16 05:25:16
【问题描述】:

我正在使用 Typescript 处理 Angular 和 Meteor。 当我建立一个集合时,我通常会声明一个全局变量(这就是 meteor 这样做的原因):

Invoices = new Mongo.Collection( 'invoices' );

现在我想将Invoices 添加到我的打字稿自定义定义中,这样代码的智能感知就不会被它绊倒。 但是,Invoices 是窗口对象的一部分,我不能复制模块声明。

只需将其添加到我的 custom.d.ts 文件中即可在我的代码中使用智能感知

var Invoices: Mongo.Collection<any>;

但是代码不喜欢var。它说我需要使用声明模块。 但是,我无法重新声明模块 Window。

所以我有点茫然如何正确地做到这一点。

【问题讨论】:

  • declare var Invoices: Mongo.Collection&lt;any&gt;; 似乎有效。这是最好的方法吗?
  • 请将此评论转换为答案。这是 TS 1.8+ 的最佳选择。事实上,我认为这是唯一一个在模块内工作的。

标签: typescript


【解决方案1】:

除了 Zeeshan 的回答,TypeScript 中的接口是自合并的。定义此变量的另一种方法是将其添加到Window 接口,方法是使用

interface Window{
    Invoices: Mongo.Collection<any>;
}

然后可以与

一起使用
window.Invoices = /* your collection */;

这里需要注意的是,在上面的例子中window是必需的,而在使用Zeeshan的提议的地方却不是。使用哪个取决于您对代码的明确程度的偏好。我同意使用declare var 会更方便,但它也可能让开发人员搜索该变量定义的范围。

我只是提出这个建议,因为它可能是一种有价值的替代方法,具体取决于您对明确性的偏好。

【讨论】:

    【解决方案2】:

    是的,选择declare var Invoices: Mongo.Collection&lt;any&gt;;

    Good Tutorial for More Understanding

    乐于助人!

    【讨论】:

    • Zeeshan,您的编辑出错了。代码是 Visual Studio 代码,所以不是代码 :)
    【解决方案3】:

    确保接口名称是 Window (W -capital ),并且在您的声明中您需要定义小窗口。

    interface Window{
        Invoices: Mongo.Collection<any>;
    }
    
    // somewhere in class
    private myvar = window.invoice
    

    【讨论】:

    • 这需要添加到类型定义文件中吗?比如这里的最佳做法是什么?
    【解决方案4】:

    似乎工作正常的一件事是: declare var Invoices: Mongo.Collection&lt;any&gt;;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多