打字稿:无法识别 .d.ts 文件

dud*_*wad 6 typescript

这个可能非常简单,但我想弄清楚它会发疯。

我在外部 index.ts 文件中有一个非常简单的自执行函数,需要在 window 对象上注册一个全局变量。我想像这样分配它:

(() => {
  window.myCustomGlobal = new MyCustomGlobal();
})()
Run Code Online (Sandbox Code Playgroud)

我在 index.ts 旁边创建了 index.d.ts:

import { MyCustomGlobal} from './classes';

declare interface Window {
  myCustomGlobal: MyCustomGlobal;
}
Run Code Online (Sandbox Code Playgroud)

上面没有错误,一切看起来都很好。应用程序编译正常。

但是,在 IDE 中,我收到一个错误: ts2339: Property 'myCustomGlobal' does not exist on type 'Window'

我一生都无法弄清楚究竟是什么让 Typescript“弄清楚”要包含什么 .d.ts 文件。在某些库中,将 .d.ts 文件与 .js 文件放在一起会导致它被拾取,并且工作正常。事实上,我使用了与上面完全相同的接口和一个全局第三方库,效果很好;似乎我的 IDE 无法接收它。

我已经尝试添加index.d.ts到tsconfig.jsoninclude以及files没有运气。

有人可以解释一下,就像对孩子一样,是什么导致 TS 拿起声明文件?有时我觉得我明白了,然后在像这样愚蠢的简单例子中,我觉得自己像个白痴。

谢谢

Gra*_*enD 21

我们"include": ["src"]在 our 中声明tsconfig.json,这导致declarations.d.tsroot ( "/") 中未被检测到。


for*_*d04 9

这里可能有两个问题:

1.) 如果要扩充全局Window接口,则必须在全局范围内进行。您可以删除所有import/export关键字以使包含文件成为非模块/脚本。或者您declare global在模块中使用将包含在其中的所有内容标记为全局声明。像这样:

import { MyCustomGlobal} from './classes';

declare global {
  interface Window {
    myCustomGlobal: MyCustomGlobal;
  }
}
Run Code Online (Sandbox Code Playgroud)

2.) 同名文件,只是它们的.ts/.d.ts扩展名不同,不起作用。引用文档

请注意,编译器不包含可能输出的文件;例如,如果输入包含 index.ts,则排除 index.d.ts 和 index.js。通常,不建议将仅扩展名不同的文件放在一起。

所以一定要重命名index.d.ts为类似的东西global.d.ts,这样编译器不会只选择index.ts. global.d.ts如果将文件放置在 TS 项目中的某个位置,并且未指定tsconfig.jsonif"files""include"config 选项,则该文件将自动包含在内。

  • 就是这样——这是文件名。浪费几个小时试图解决这个问题真是太好了。我尝试过声明全局语法,但它不起作用,但这只是因为文件名。多谢!! (2认同)