您如何在打字稿中扩展方法的返回类型,而无需重新声明方法?

问题描述 投票:0回答:1

如果我有以下代码:

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的任何其他类一起使用?

typescript
1个回答
0
投票
感谢@jcalz为您提供帮助。最后,我们提出了两个解决方案。 @jcalz提供的第一个,使用这种类型的多态,最终看起来像下面的代码:

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();
据我所知,两者都是有效的,并且可能取决于个人喜好,尽管如果您发现有所不同,请发表评论,因为我很想听听它是什么。
© www.soinside.com 2019 - 2024. All rights reserved.