【问题标题】:(Typescript) Property 'window' does not exist on type 'Global'(打字稿)“全局”类型上不存在属性“窗口”
【发布时间】:2018-02-07 10:27:34
【问题描述】:

我正在使用 Mocha/Chai 进行单元测试,并且正在模拟 window 如下:

global.window = { innerHeight: 1000, innerWidth: 1000 };

可以理解,TSLint 抱怨说:

“全局”类型上不存在属性“窗口”

几个问题...Global 是内置的 NodeJS/Typescript 类型吗?我目前正在使用文件顶部的declare var global 来消除警告...但这是处理此问题的最佳方法吗?我注意到我还可以通过以下方式解决警告:

declare global {
    namespace NodeJS {
        interface  Global {
            window: any;
        }
    }
}

最好我想扩展现有的Global 类型,使其也接受window 属性。谢谢。

【问题讨论】:

  • 你也可以在TS中这样引用window对象:(<any>window)。恕我直言,不漂亮,但确实抑制了警告
  • 我认为合并你正在做的声明没有任何问题......也许我建议将其设为 {window: Window} 而不是 {window: any},但这取决于你。跨度>

标签: javascript node.js typescript


【解决方案1】:

Global 是内置的 NodeJS/Typescript 类型吗?

是的。见@types/node/index.d.ts;在该文件中,他们声明了一个 NodeJS 命名空间,并在其中声明了一个 Global 接口(就像您所做的那样)。

我目前正在使用 declare var global 消除警告

听起来您没有安装 Node 类型(这些类型包括 declare var global: NodeJS.Global; 行,因此您不必自己进行任何此类声明)。运行:

npm install --save-dev @types/node

或者,如果您使用yarn

yarn add -D @types/node

最好我想扩展现有的Global 类型,使其也接受window 属性。

你大部分时间都在那里。只需将window: any; 替换为window: Window;。注意:您需要在您的tsconfig.jsonlib 部分中包含dom 以提供Window 接口。

您可能很快会发现您还想扩充 Global documentnavigator(同样,这两个都在 dom 库中定义,因此需要它):

interface Global {
    document: Document;
    window: Window;
    navigator: Navigator;
}

【讨论】:

  • 我似乎无法让它工作......你能澄清一下吗?那么全局接口应该在global.d.ts文件的根目录下定义吗?而 Document、Window 和 Navigator 应该从“jsdom”导入?我们的规则是我们所有的接口都应该以大写 I 开头。“IGlobal”有问题吗?我收到一个未使用的错误消息。
  • Global 接口可以定义为:1) 在您需要引用它的每个文件中(在这种情况下,您可以拥有顶级importexport 周围的声明);或 2) 在其自己的任意名称的 .d.ts 文件中,在项目中 tsconfig.json 将查找它的任何位置(例如 src/myGlobals.d.ts)。 Document、Window 和 Navigator 接口由核心 dom.lib.d.ts 定义,但也可能由 JSDom 定义。 JSDom 可以为非浏览器环境填充其实现。它必须命名为 Global,不是 IGlobal,以扩充现有的有意义的 Global 接口。
猜你喜欢
  • 2016-12-12
  • 2017-03-02
  • 2021-09-07
  • 2017-08-07
  • 2017-03-26
  • 2017-09-06
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多