如何扩展’Window’打字稿界面

在我的示例中,我正在尝试扩展TS Window接口以包含用于获取的polyfill.为什么无所谓.问题是“我怎么告诉TS window.fetch是一个有效的函数?”

I’m doing this in VS Code,v.0.3.0 which is running TS v.1.5 (IIRC).

在我想要使用它的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”而不是原位?

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

如果您的文件中有顶级导入或导出(您必须在某处遇到此问题),则您的文件是外部模块.

在外部模块中,声明接口始终会创建新类型,而不是扩充现有的全局接口.这模仿了模块加载器的一般行为 – 在此文件中声明的内容不会合并或干扰全局范围内的事物.

这种回转的原因在于,在外部模块中,没有办法定义与全局范围中的变量或类型具有相同名称的新变量或类型.

相关文章

文章浏览阅读2.2k次,点赞6次,收藏20次。在我们平时办公工作...
文章浏览阅读1k次。解决 Windows make command not found 和...
文章浏览阅读3.2k次,点赞2次,收藏6次。2、鼠标依次点击“计...
文章浏览阅读1.3w次。蓝光版属于高清版的一种。BD英文全名是...
文章浏览阅读974次,点赞7次,收藏8次。提供了更强大的功能,...
文章浏览阅读1.4w次,点赞5次,收藏22次。如果使用iterator的...