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

通过静态create方法实现异步构造函数的TypeScript类型问题

TypeScript异步构造函数基类中create方法的返回类型定义问题

我正在开发一个支持异步构造函数的通用抽象基类,它在JavaScript中运行正常,但在TypeScript里遇到了类型定义问题。期望实现的效果是:

const a: AnyClass = await AnyClass.create();

目前这段代码在JS中能正常工作,但TS因类型缺失报错。以下是类似的DbConnection类示例:

class DbConnection extends AsyncConstructor<[serverId: number, url: string]> {
    #serverId: number;
    #connection: Connection;

    protected constructor(serverId: number, url: string) {
        super(serverId, url);
        this.#serverId = serverId;
    }

    protected override async constructorAsync(serverId: number, url: string): Promise<void> {
        this.#connection = await DB.connect(url);
    }
}

基类代码如下:

class AsyncConstructor<CtorParams extends any[]> {
    protected constructor(...args: CtorParams) {}

    protected async constructorAsync(...args: CtorParams): Promise<void> {
        return Promise.resolve();
    }

    // =-->>> 以下方法缺少类型定义: <<<--=
    static async create(...args: CtorParams) {
        const res = new this(...args);
        await res.constructorAsync(...args);
        return res;
    }
}

请问create方法的返回类型应该如何指定?


要解决这个问题,你需要让create方法的返回类型指向当前子类的实例类型。可以通过给AsyncConstructor类的静态方法添加泛型约束,让this指向子类构造函数,从而正确推断返回类型。

修改后的基类代码如下:

class AsyncConstructor<CtorParams extends any[]> {
    protected constructor(...args: CtorParams) {}

    protected async constructorAsync(...args: CtorParams): Promise<void> {
        return Promise.resolve();
    }

    static async create<T extends AsyncConstructor<CtorParams>>(
        this: new (...args: CtorParams) => T,
        ...args: CtorParams
    ): Promise<T> {
        const res = new this(...args);
        await res.constructorAsync(...args);
        return res;
    }
}

关键说明:

  • 通过this: new (...args: CtorParams) => T约束静态方法中的this类型,确保它是能构造出T实例的构造函数,其中T是子类的类型。
  • 返回类型指定为Promise<T>,这样TypeScript就能正确推断出create方法返回的是子类的实例Promise,比如调用DbConnection.create(1, "url")会得到Promise<DbConnection>类型。

这样修改后,你就能实现期望的类型效果:

const conn: DbConnection = await DbConnection.create(1, "db://example.com");
// TS会正确推断conn的类型,不会再报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 16:00:01