在用 TS 进行 electron 开发时,我需要在 main 端将一些方法数据挂在在 global 对象上。比如我需要将 windows 对象挂在到 global 上,但是一写则报 TS2339 这个错误:
Property 'windows' does not exist on type 'Global'.
网上找了很多办法,比如定义全局 type 文件等等,最后的结局方法如下。
最终解决方法
// windows.ts
// import ....
declare global {
namespace NodeJS {
interface Global {
windows: Electron.BrowserWindow;
}
}
}
// ...业务代码
global.windows = window
// ...业务代码
解决方案原理
在官方的 handbook 中,有一段解释如下:
在TypeScript中,就像在ECMAScript 2015中一样,任何包含顶级
import
或者export
的文件都被视为模块(Modules)。相反,没有任何顶级导入或导出声明的文件被视为脚本,其内容在全局范围内可用(因此也可用于模块)。
直白的话就是,当有 import 或者 export 之后,所有的对象都是在这个模块中了,所以不能够采用 global.d.ts
的方法重新定义一个 typings 文件。所以如果需要修改 global 这个对象,必须在当前文件下 declare
出 global 对象然后在 NodeJS 的命名空间中扩展 Global 的字段。
参考
关注前端技术的小伙伴,欢迎点击扫描下面的二维码加入我建的 「前端开发交流群」,共同交流前沿前端技术。
我是空谷,独立产品经理、全栈设计师、全栈工程师。
技术栈为 React/Dva/Umi/Node/Egg/Electron
欢迎扫码加我微信交流,备注来源:CSDN