如何扩展“Window”打字稿界面

Posted

技术标签:

【中文标题】如何扩展“Window”打字稿界面【英文标题】:How to extend the 'Window' typescript interface 【发布时间】:2015-09-06 17:59:36 【问题描述】:

在我的示例中,我正在尝试扩展 TS Window 界面以包含 fetch 的 polyfill。为什么不重要。问题是“我如何告诉 TS window.fetch 是一个有效的函数?

我在运行 TS v.1.5 (IIRC) 的 VS Code v.0.3.0 中执行此操作。

在我想要使用的 TS 类文件中声明接口不起作用:

///<reference path="typings/tsd.d.ts"/>

interface Window 
  fetch:(url: string, options?: ) => Promise<any>

...
window.fetch('/blah').then(...); // TS objects that window doesn't have fetch

但是如果我在一个单独的“.d.ts”文件中声明这个相同的接口并在我的 TS 类文件中引用它就可以了。

这里是“typings/window.extend.d.ts”

///<reference path="es6-promise/es6-promise"/>
interface Window 
  fetch:(url: string, options?: ) => Promise<any>

现在我可以在我的 TS 类文件中使用它:

///<reference path="typings/window.extend.d.ts"/>
...
window.fetch('/blah').then(...); // OK

或者,我可以在我的 TS 类文件中编写一个扩展接口使用另一个名称,然后在强制转换中使用它:

interface WindowX extends Window 
  fetch:(url: string, options?: ) => Promise<any>

...
(<WindowX> window).fetch('/blah').then(...); // OK

为什么扩展界面在“d.ts”中起作用而不是原位

我真的必须经历这些回旋吗?

【问题讨论】:

一个明确的问题.... 完成扩展接口的最佳方法是什么?我看到了这两者的优点和缺点 【参考方案1】:

当您的文件中有***importexport(您必须在某个地方遇到此问题)时,您的文件就是一个外部模块

在外部模块中,声明接口总是会创建新类型,而不是扩充现有的全局接口。这模仿了模块加载器的一般行为——在这个文件中声明的东西不会合并或干扰全局范围内的东西。

这种旋转的原因是,否则将无法在外部模块中定义与全局范围内同名的新变量或类型。

【讨论】:

您能否提供有关此问题的一些文档的链接?也许Declaration Merging wiki 条目需要扩展? 确实有***的import 语句。你说的有道理,现在我明白了。但我仍然不知道这两种方法的优缺点,或者是否有更好的第三种方法。我确信扩展window 将是一个应该清楚记录的常见场景。 Declaration Merging 肯定需要详细说明...尤其是因为 interface Document 示例在我的用例中不起作用 我们喜欢准确的打字。当他们不是时,我们讨厌他们。有一条干净的路径来扩展它们很重要。我也想知道这里的其他选择 干净的方法是将它们放在另一个文件中。没有其他方法可以表明您想在全局命名空间中声明某些内容。 可以从外部模块中扩展window 对象。在这里查看我的答案:***.com/a/40204572/274837【参考方案2】:

你需要declare global

declare global 
  interface Window 
    fetch:(url: string, options?: ) => Promise<any>
  

这样就可以了:

window.fetch('/blah').then(...); 

【讨论】:

你在使用 webpack 吗?对我来说,我在一个模块中全局声明的东西在其他模块中是不可见的。有什么线索吗? 下面的答案有助于阐明为什么会这样。另见:typescriptlang.org/docs/handbook/…

以上是关于如何扩展“Window”打字稿界面的主要内容,如果未能解决你的问题,请参考以下文章

如何扩展递归打字稿接口?

如何将打字稿界面转换为棱镜模型

如何在打字稿中扩展字符串?

打字稿:如何扩展现有的模块定义?

打字稿混淆:如何使用自定义和绝对类型库扩展 Express `Request`?

如何在打字稿元组中使用扩展运算符?