【问题标题】:TypeScript error: Property 'X' does not exist on type 'Window'TypeScript 错误:“Window”类型上不存在属性“X”
【发布时间】:2019-10-20 19:31:16
【问题描述】:

我已将 TS 添加到我的 React/Redux 应用程序中。

我在我的应用程序中使用 window 对象,如下所示:

componentDidMount() {
  let FB = window.FB;
}

TS 抛出错误:

TypeScript 错误:“窗口”类型上不存在属性“FB”。 TS2339

我想修正错误。

1(不起作用)

// Why doesn't this work? I have defined a type locally

type Window = {
  FB: any
}

componentDidMount() {
  let FB = window.FB;
}

// TypeScript error: Property 'FB' does not exist on type 'Window'. TS2339

2(修复错误)

我在这里找到了答案https://stackoverflow.com/a/56402425/1114926

declare const window: any;

componentDidMount() {
  let FB = window.FB;
}
// No errors, works well

为什么第一个版本不起作用,但第二个版本起作用,即使我根本没有指定 FB 属性?

【问题讨论】:

  • 你使用模块吗?答案会有所不同
  • 我使用 React 组件。以上所有行为都来自 React 组件。它们可能被称为模块,因为它们封装了逻辑

标签: reactjs typescript create-react-app


【解决方案1】:

有几种方法可以解决这个问题:

一些例子:

1-) 做一个演员表:

(window as any).X

2-) 将以下代码放入文件 react-app-env.d.ts

interface Window {
  X?: {
    Y?: {
      .......
    }
  }
}

【讨论】:

  • W̶i̶n̶d̶o̶w̶s̶(任意窗口).X
【解决方案2】:

我使用它而不声明全局

declare const window: Window &
   typeof globalThis & {
     FB: any
   }

【讨论】:

  • 括号太多...删除它我得到Cannot redeclare block-scoped variable 'window'
【解决方案3】:

更好

declare global {
  interface Window {
    FB: {
      CustomerChat: {
        hide: () => void;
        show: () => void;
      };
    };
  }
}

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
【解决方案4】:

您可以轻松解决问题无需声明

window["FB"]

【讨论】:

    【解决方案5】:

    为什么declare const window: any; 有效?

    因为你声明了一个any 类型的局部变量。拥有any 类型的东西基本上会关闭window 的类型检查,所以你可以用它做任何事情。我真的不推荐这个解决方案,它是一个非常糟糕的解决方案。

    为什么type Window = { FB: any } 不起作用? 你定义了一个类型Window。如果在模块中定义此类型,则与全局 window 对象的类型无关,它只是在您的模块中碰巧被称为 Window 的类型。

    好的解决方案 要扩展window,您必须扩展全局Window 接口。你可以这样做:

    declare global {
        interface Window {
            FB:any;
        }
    }
    
    let FB = window.FB; // ok now
    

    请注意,此扩展将在您的整个项目中可用,而不仅仅是您在其中定义它的文件。此外,如果 FB 有定义,您可能会考虑更好地输入它 (FB: typeof import('FBOrWhateverModuleNameThisHas'))

    【讨论】:

    • 您的“好解决方案”无法编译。“类型窗口和类型 globalThis 上不存在属性 FB”
    • @jtiscione 是的 typescriptlang.org/play?noImplicitReturns=false#code/… 如果您的文件不是模块,请删除声明全局 typescriptlang.org/play?noImplicitReturns=false#code/…
    • 为什么这个答案没有被标记为答案?我找了很久很久才找到一种从控制台/外部 JS 访问反应状态函数的方法,这是唯一在 TS 中编译并工作的方法
    • @Beerswiller 因为 OP 无法让它工作,也懒得跟进 ?‍♂️
    • 如果管理员关心本网站内容的质量,他们会接管这个被遗弃的问题并接受答案。
    猜你喜欢
    • 1970-01-01
    • 2018-03-25
    • 2022-01-04
    • 2023-02-21
    • 2019-04-12
    • 2020-07-09
    • 2021-09-26
    • 2021-12-15
    • 2017-01-19
    相关资源
    最近更新 更多