这可能非常简单,但是我很努力地试图弄清楚。
我在外部index.ts文件中有一个非常简单的自执行函数,该文件需要在window对象上注册一个全局变量。我想这样分配它:
(() => {
window.myCustomGlobal = new MyCustomGlobal();
})()
我与index.ts一起创建了index.d.ts:
import { MyCustomGlobal} from './classes';
declare interface Window {
myCustomGlobal: MyCustomGlobal;
}
上面没有错误,一切看起来不错。该应用程序可以正常编译。
但是,在IDE中,出现错误:
ts2339: Property 'myCustomGlobal' does not exist on type 'Window'
我一辈子都无法弄清楚究竟是什么使Typescript“弄清楚”要包括的.d.ts文件。在某些库中,将.d.ts文件与.js文件放在一起会导致它被拾取,并且工作正常。实际上,我将与上述完全相同的接口与全局第三方lib一起使用,并且效果很好。好像我的IDE不会接它。
我尝试将index.d.ts
和include
的{{1}}添加到tsconfig.json中,但是没有运气。
有人能像孩子一样解释什么导致TS提取声明文件吗?有时候我觉得自己懂了,然后在像这样的愚蠢简单例子中,我觉得自己像个白痴。
谢谢
答案 0 :(得分:5)
这里可能有两个问题:
1。)如果要扩展全局Window
接口,则必须在全局范围内进行。您可以删除所有import
/ export
关键字,以使包含文件成为非模块/脚本。或者,您可以在模块中使用declare global
,将包装在其中的所有内容标记为全局声明。像这样:
declare global {
interface Window {
myCustomGlobal: MyCustomGlobal;
}
}
2。)同名文件,仅扩展名.ts
/ .d.ts
不起作用。引用docs:
请注意,编译器不包含可能作为输出的文件;例如如果输入包含index.ts,则排除index.d.ts和index.js。通常,不建议让文件的扩展名彼此相邻。
因此,请确保将index.d.ts
重命名为类似global.d.ts
的名称,以便编译器不仅选择index.ts
。如果将global.d.ts
文件放在由tsconfig.json
标记的TS项目中的某个位置,并且{
如果"files"
和"include"
配置选项未指定。