TypeScript继承场景下如何调用当前类类型?fromObject方法应指定何种返回类型?
在TypeScript继承类中调用当前类类型及静态方法返回类型的处理
一、如何在继承类中调用当前类的类型
分两种场景来具体说明:
1. 在实例方法中获取当前类类型
在实例方法里,你可以通过this.constructor拿到当前类的构造函数,但TypeScript默认会把constructor的类型推断为Function,所以需要做个类型断言才能正确使用。举个实际例子:
class Entity { getCurrentClass(): typeof Entity { return this.constructor as typeof Entity; } } class User extends Entity { getCurrentClass(): typeof User { return this.constructor as typeof User; } }
如果想让这个逻辑适配所有子类,也可以用泛型来实现通用化:
class Entity { getCurrentClass<T extends Entity>(this: T): typeof T { return this.constructor as typeof T; } } class User extends Entity {} const user = new User(); const userClass = user.getCurrentClass(); // userClass的类型自动推断为typeof User
2. 在静态方法中获取当前类类型
静态方法里的处理就简单多了,直接用this就能指代当前类(包括子类继承后调用时的子类本身)。比如在静态方法里创建当前类的实例:
class Entity { public static createInstance() { return new this(); // 子类调用时,this会自动指向子类 } } class User extends Entity {} const user = User.createInstance(); // user的类型自动推断为User
二、Entity类中fromObject静态方法的返回类型指定
你想要这个静态方法返回当前类类型的实例,最优雅且符合TypeScript特性的方式是把返回类型设为this。当子类继承Entity后调用fromObject,TypeScript会自动把返回类型适配成子类的实例类型。
修改后的完整代码示例:
// 先定义QueryRow类型,这里假设是任意键值对对象 type QueryRow = Record<string, any>; class Entity { public toObject(): QueryRow { throw new Error('This method has to be overriden and implemented'); } // 返回类型设为this,自动适配当前类及子类 public static fromObject(object: QueryRow): this { const instance = new this(); // 这里可以添加实例初始化逻辑,比如从object中赋值属性 return instance; } } class User extends Entity { username: string; public toObject(): QueryRow { return { username: this.username }; } // 子类重写时可以指定更具体的返回类型 public static fromObject(object: QueryRow): User { const user = super.fromObject(object) as User; user.username = object.username; return user; } } const user = User.fromObject({ username: 'Alice' }); // user的类型为User,完全符合预期
如果想要更严谨的类型约束,也可以结合泛型和this参数来定义:
class Entity { public static fromObject<T extends Entity>(this: new () => T, object: QueryRow): T { const instance = new this(); // 初始化逻辑 return instance; } }
这种方式会强制要求调用fromObject的类必须具备无参构造函数,类型推断也会更精准。
内容的提问来源于stack exchange,提问作者Uri
相关产品推荐
相关产品推荐

