Dav*_*vіd 8 javascript typescript
我最近将我的项目从 3.9.9 升级到 TypeScript 4.4.3。
"strictNullChecks": true,我的项目在其 中使用tsconfig.json,并在浏览器中运行,而不是在 Node.js 上的服务器端运行。
在 TypeScript 4.4.3 中,似乎类型声明top已更改为WindowProxy | null( node_modules/typescript/lib/lib.dom.d.ts)
这意味着无论我尝试访问2的属性,我都会收到以下错误1 :TS Playgroundtop
const topUrl = top.window.location.href; // => Object is possibly 'null'.
Run Code Online (Sandbox Code Playgroud)
如何仅在可能为空时忽略此类错误top?3
1据我所知,此错误警告我注意我的网站在 iframe 中加载的情况,因此top由于 XSS 而无法访问。这不是问题,因为我的'X-Frame-Options'设置为'sameorigin',因此将拒绝在跨源 iframe 中加载我的网站。
2我访问 的属性,top因为我在项目中经常使用 iframe,它会加载同一域上的子页面。
3我可以使用以下修复来解决这个问题Object is possibly 'null'.,但我不想这样做,因为我的项目相当大,而且这个修复将很乏味,而且改进很少。
let topUrl = top?.window.location.href || '';
Run Code Online (Sandbox Code Playgroud)
let topUrl = '';
if (top) {
topUrl = top.window.location.href;
}
Run Code Online (Sandbox Code Playgroud)
我也可以忽略每一行上的这些错误// @ts-ignore,但有很多引用top,我不想让项目变得混乱(此外,同一行上的其他 TypeScript 错误将被忽略)。
// @ts-ignore
const topUrl = top.window.location.href;
Run Code Online (Sandbox Code Playgroud)
我找到了一个可能适合您需求的解决方案。您可以考虑该解决方案的两个版本。
这两个版本都通过使用同样由 Microsoft 提供的lib-domnpm 包覆盖内置版本来工作。@types/web
typescript@4.5.0-beta按照以下步骤操作,一切都会按您的预期工作,无需任何其他代码修改:
TypeScript4.5.0:
npm i -D typescript@4.5.0-beta
Run Code Online (Sandbox Code Playgroud)
或全局安装
npm i -g typescript@4.5.0-beta
Run Code Online (Sandbox Code Playgroud)
@types/web@0.0.1有top: Windowtype
的 type 包npm i -D @typescript/lib-dom@npm:@types/web@0.0.1
Run Code Online (Sandbox Code Playgroud)
我对此解决方案进行了一些简单的测试,并设法获得了您想要的行为。
该解决方案的唯一缺点是 typescript@4.5 目前仍处于测试阶段。但它值得您考虑,因为它的最终版本将于下个月发布。
typescript4.4.3 并切换内置 dom lib。安装@types/web
npm i -D @types/web@0.0.1
Run Code Online (Sandbox Code Playgroud)
请注意,安装命令与上面的命令不同。
更新您的tsconfig.json. 有两种情况需要考虑,具体取决于您是否已lib定义。tsconfig.json
第二个版本的解决方案的缺点是,它无法阻止您的依赖项node_modules拉入 TypeScript DOM 库。
请记住,尽管@types/web版本已达到 0.0.40,但仅输入了 0.0.1 版本,@types/web而top不是top: Window您top: WindowProxy | null需要的版本。
| 归档时间: |
|
| 查看次数: |
1257 次 |
| 最近记录: |