通过静态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
相关产品推荐
相关产品推荐

