【问题标题】:Check if a property exists on global or window object in TypeScript检查 TypeScript 中的全局或窗口对象上是否存在属性
【发布时间】:2020-05-09 16:29:35
【问题描述】:

我想将此 JavaScript 代码转换为 TypeScript:

if (!window.INITIALIZED) {
  init();
  window.INITIALIZED = true;
}
runCode();

window 对象是在 TypeScript 中键入的,编译器会抛出一个错误,指出 INITIALIZED 属性在类型 'Window & typeof globalThis' 上不存在。

如何在不禁用 TypeScript 功能或忽略对这些行的类型检查的情况下正确解决此问题?

【问题讨论】:

  • 由于window 是全局的,你可以只写if(!INITIALIZED){...INITIALIAZED = true 并让作用域链处理剩下的事情。
  • @ScottMarcus 这样编译器会抛出Cannot find name 'INITIALIZED'

标签: javascript typescript types


【解决方案1】:

您可以通过将其添加到Window 接口让 TS 将其识别为有效的窗口属性:

declare global {
    interface Window {
        INITIALIZED: boolean | undefined;
    }
}
if (!window.INITIALIZED) {
  init();
  window.INITIALIZED = true;
}
runCode();

也就是说,分配给全局对象的属性是bit在不必要时的代码味道。如果可能,请考虑使用普通变量。

【讨论】:

  • 这行得通。 :) 如果我想这样做,我是否也应该将declare global 放在index.d.ts 文件中?
  • 像这样的全局更改只能在模块中(就像您的其他 TS 代码一样),或者在环境模块声明中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2018-01-01
  • 2013-07-06
相关资源
最近更新 更多