You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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方法...
}

额外注意事项

  1. 确保this.VIEWS_PATH和this.VIEWS_EXTENSION也被正确初始化了,不然window.loadFile也会因为路径错误出问题。
  2. 如果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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:39:57