我已将TS添加到React/Redux应用程序中。
我在应用中使用window
对象,如下所示:
componentDidMount() {
let FB = window.FB;
}
TS抛出错误:
类型脚本错误:类型"Window"上不存在属性"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属性?
8条答案
按热度按时间mzsu5hc01#
为什么
declare const window: any;
工作?因为你声明了一个
any
类型的局部变量。拥有any
类型的东西本质上关闭了对window
的类型检查,所以你可以用它做任何事情。我真的不推荐这个解决方案,它真的很糟糕。**为什么
type Window = { FB: any }
不工作?**您定义了一个类型Window
。如果在模块中定义了这个类型,它与全局window
对象的类型无关,它只是一个在模块中碰巧被称为Window
的类型。好的解决方案要扩展
window
,必须扩展全局Window
接口。请注意,此扩展名将在整个项目中可用,而不仅仅是在定义它的文件中可用。此外,如果
FB
有定义,您可能会考虑键入它更好一点(FB: typeof import('FBOrWhateverModuleNameThisHas')
)xdnvmnnf2#
有几种方法可以解决这个问题:
一些例子:
1-)做一个演员阵容:
2-)将以下代码放入文件react-app-env. d. ts中
vsikbqxv3#
您可以轻松地解决问题而无需声明
由于它是一种没有任何编译器配置的变通方法,可以确保程序与类型脚本的兼容性,因此您可能只需要进行类型验证。
uemypmqf4#
我使用此函数时没有声明global
vaj7vani5#
我在我的角代码中遇到了这个问题。下面的解决方案帮助我解决了这个问题。
我通过在src内创建名为types的文件夹并在该文件夹内创建index.d.ts文件解决了此错误。
index.d.ts文件将具有以下代码。
如果错误仍然存在,请尝试将types目录的路径添加到tsconfig.json文件中。
w6lpcovy6#
更好的是
utugiqy67#
HACK SOLUTION针对问题“TypeScript中的类型Window上不存在属性”
STEP:1在src目录中创建一个types目录,其中包含以下index.d.ts文件:源代码/类型/索引.d.ts
STEP:2将types目录的路径添加到tsconfig.json文件中。
tsconfig.json
STEP:3现在使用它,无论你想做什么。
noj0wjuj8#
对于来自Next.Js的任何人,您需要在
<body>
中使用<Script />
来加载它(在<Head />
中加载它是行不通的):https://nextjs.org/docs/basic-features/script