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

TypeScript类如何初始化依赖多个Promise的变量?

解决方案

方案1:使用静态异步工厂方法(最推荐)

该方案完全规避了构造函数不能异步的限制,是TypeScript场景下的最佳实践,不会产生类型报错,也能保证返回的实例已经完成全部初始化逻辑。

import puppeteer, { type Page, type Browser } from 'puppeteer';

class Puppet {
  private page: Page;
  private browser: Browser;
  // 将构造函数设为私有,禁止外部直接new,强制走工厂方法创建实例
  private constructor() {}

  static async create(): Promise<Puppet> {
    const instance = new Puppet();
    // 完整执行初始化逻辑后再返回实例
    instance.browser = await puppeteer.launch({ headless: true });
    instance.page = await instance.browser.newPage();
    await instance.page.goto('你的目标url');
    return instance;
  }

  // 其他自定义类方法
  async doSomething() {
    await this.page.click('目标元素选择器');
  }
}

// 调用方式
const puppet = await Puppet.create();

方案2:将page声明为Promise类型

如果你的业务场景允许每次调用page时都做await操作,可以直接把page的类型定义为Promise<Page>,支持直接new实例:

class Puppet {
  private page: Promise<Page>;
  private browser: Promise<Browser>;
  
  constructor() {
    // 直接把初始化的Promise赋值给属性
    this.browser = puppeteer.launch({ headless: true });
    this.page = this.browser.then(browser => browser.newPage());
    // 如果需要把goto逻辑也包含在初始化里
    this.page = this.page.then(async page => {
      await page.goto('你的目标url');
      return page;
    })
  }

  async doSomething() {
    const page = await this.page;
    await page.click('目标元素选择器');
  }
}

// 调用方式
const puppet = new Puppet();

临时修复TS报错方案(不推荐)

如果你一定要沿用原本的写法,可以给page属性加明确赋值断言规避TS报错,但需要自行保证调用page相关方法前初始化已经完成,否则会出现运行时undefined错误:

class Puppet {
  // 加!告诉TypeScript这个属性后续会被初始化,也可以写为 private page?: puppeteer.Page
  private page!: puppeteer.Page;
  
  constructor() {
    void this.initialize();
  }

  async initialize(){
    const browser = await puppeteer.launch({headless:true});
    this.page = await browser.newPage();
    await this.page.goto(this.url);
  }
}

内容的提问来源于stack exchange,提问作者Jae

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:27:02