如果我有以下代码:
abstract class Base {
}
class Extended extends Base {
}
abstract class BaseService {
protected static entity = Base
public getEntity() {
return (this.constructor as typeof BaseService).entity
}
}
class ExtendedService extends BaseService {
protected static entity = Extended
}
const entityClass = new ExtendedService().getEntity();
constentityClass的类型为“ typeof Base”,即使它实际上是Extended类。有没有一种方法可以在BaseService中定义getEntity,以便它的返回类型由用于创建服务实例的类中的静态实体确定(在本例中为ExtendedService,但它也可以与扩展BaseService的任何其他类一起使用?
type HeritableCtor<T> = Pick<T, keyof T>;
class Base {
}
class Extended extends Base {
extendedProp = "hello";
}
abstract class BaseService {
["constructor"]: HeritableCtor<typeof BaseService>;
static entity = Base
public getEntity(): this['constructor']['entity'] {
return this.constructor.entity
}
public getEntityInstance(): InstanceType<this['constructor']['entity']> {
return new this.constructor.entity() as InstanceType<this['constructor']['entity']>;
}
}
class ExtendedService extends BaseService {
["constructor"]: HeritableCtor<typeof ExtendedService>;
static entity = Extended
}
const extended = new ExtendedService().getEntityInstance();
还有第二个,它利用通用类型:type HeritableCtor<T> = Pick<T, keyof T>; type Constructor<T> = new(...args: any[]) => T; class Base { } class Extended extends Base { extendedProp = "hello"; } abstract class BaseService<Entity extends Base> { ["constructor"]: HeritableCtor<typeof BaseService>; static entity = Base public getEntity(): Constructor<Entity> { return this.constructor.entity as Constructor<Entity>; } public getEntityInstance(): Entity { return new this.constructor.entity() as Entity; } } class ExtendedService extends BaseService<Extended> { ["constructor"]: HeritableCtor<typeof ExtendedService>; static entity = Extended } const extended = new ExtendedService().getEntityInstance();
据我所知,两者都是有效的,并且可能取决于个人喜好,尽管如果您发现有所不同,请发表评论,因为我很想听听它是什么。