TypeScript编译ES5后出现Cannot read property 'push'错误求助
解决TypeError: Cannot read property 'push' of undefined(Electron + TypeScript场景)
你完全说对了!这个报错的核心原因就是你只在TypeScript里声明了windows数组,但没有做实际的初始化操作。
TypeScript里的!非空断言只是给编译器的提示——告诉它“这个变量后续肯定会被赋值,别给我报未初始化的错”,但它不会帮你在编译后的JavaScript代码里自动创建并初始化这个数组。所以到了运行时,this.windows其实是undefined,调用push方法自然就会触发TypeError。
解决方法:给windows数组做初始化
有两种简单的方式可以搞定:
方式1:声明时直接初始化
直接在变量声明的时候给它赋值一个空数组,这样连非空断言都不需要了:
// 把原来的声明替换成这个 private windows: [string, BrowserWindow][] = [];
方式2:在类的构造函数里初始化
如果你需要在构造函数里做一些额外逻辑再初始化数组,可以这么写:
class YourWindowClass { private windows!: [string, BrowserWindow][]; private VIEWS_PATH: string; private VIEWS_EXTENSION: string; constructor() { // 初始化windows数组 this.windows = []; // 别忘了初始化你的路径和后缀变量,不然loadFile也可能出问题 this.VIEWS_PATH = "./your-views-folder-path"; this.VIEWS_EXTENSION = ".html"; } // 你的createWindow方法... }
额外注意事项
- 确保
this.VIEWS_PATH和this.VIEWS_EXTENSION也被正确初始化了,不然window.loadFile也会因为路径错误出问题。 - 如果
createWindow是作为事件回调被调用的(比如Electron的菜单点击事件),要注意this的指向问题——可以用箭头函数定义方法,或者在构造函数里绑定this:constructor() { this.createWindow = this.createWindow.bind(this); }
修正后的完整示例代码
import { BrowserWindow, BrowserWindowConstructorOptions } from 'electron'; class WindowManager { private VIEWS_PATH = "./src/views"; // 替换为你的实际视图路径 private VIEWS_EXTENSION = ".html"; // 替换为你的实际视图后缀 private windows: [string, BrowserWindow][] = []; public createWindow(windowView: string, windowOptions?: BrowserWindowConstructorOptions): BrowserWindow { const window = new BrowserWindow(windowOptions); // 用模板字符串让路径拼接更清晰 window.loadFile(`${this.VIEWS_PATH}/${windowView}${this.VIEWS_EXTENSION}`); this.windows.push([windowView, window]); window.on('close', (event) => { console.log('deleted', event.sender.id); this.deleteWindow(undefined, event.sender.id); }); return window; } // 示例deleteWindow实现 private deleteWindow(_: unknown, windowId: number): void { this.windows = this.windows.filter(([_, win]) => win.id !== windowId); } }
内容的提问来源于stack exchange,提问作者leandrojesus-programmer
相关产品推荐
相关产品推荐

