我应该如何告诉 Typescript 编译器在其他地方定义的全局变量?

Cod*_*rer 6 javascript visual-studio-code

我正在编写普通 Javascript并尝试通过指定checkJs标志在 VSCode 中使用 TS 类型检查。(过去一周这真是一次冒险!)

我的项目使用 Webpack / Babel 捆绑的 ES6 模块;入口点 ( app.js) 导出一个全局变量:

var viewer;
viewer = ...
window.viewer = viewer;
Run Code Online (Sandbox Code Playgroud)

我告诉其他模块这个变量,所以eslint不会打扰我:

/* global viewer */
var val = viewer.val;
Run Code Online (Sandbox Code Playgroud)

这工作正常,但现在 TS 检查器抱怨

[js] Cannot find name 'viewer'.
Run Code Online (Sandbox Code Playgroud)

我如何告诉 TS 编译器我已经在当前文件之外定义了它?TS 是否需要更新以尊重 eslintglobal注释,或者它可能有自己的注释指令语法?

Ste*_*han 2

TypeScript 绝对不尊重 eslint 注释,因为它是注释。为了告诉 TS 外部变量可用,您可以简单地编写declare let viewer: any;(或用const代替let)。

  • 再说一次,我不是在*写* TS,这是一个 `.js` 文件,而不是一个 `.ts` 文件;我正在使用 VSCode `checkJs` 选项告诉它对我的(普通、Javascript)代码进行类型检查。我感觉我是互联网上第一个使用这个功能的人! (5认同)
  • 我强烈不想只是为了让检查器满意而在我的构建中添加“.d.ts”文件,但如果必须的话,我想我会弄清楚的。我在 GH 讨论中看到,您可以只添加一个“varviewer”,但我认为这会隐藏(?)其他模块中附加的“window.viewer”?我将关注 GH 问题,因为我希望看到一个更好的解决方案,用于在普通 JS 中对“window”对象进行猴子修补。 (3认同)
  • 抱歉,我忘记写的部分是将其写入外部 TS 文件。有关您的信息,请访问 [GitHub](https://github.com/Microsoft/TypeScript/issues/15626),正如 weswigham 指出的那样,正在持续讨论您的问题,应该可以只键入注释一个简单的 `var查看器;` 在您的文件中,它使用该变量。 (2认同)