如何确定注入属性的具体类型?TypeScript继承场景问题
问题:抽象类继承后丢失依赖注入的具体类型
现有一个实现ISession接口的抽象类Session,部分属性需要注入IExtension类型实例,但子类继承后无法访问注入的具体Extension类的独有方法和属性:
抽象类代码:
export abstract class Session<TConfig extends object, TData extends object> implements ISession<TConfig, TData>{ public extension: IExtension<TConfig, TData>; public role?: PartnerUserRoleEnum | undefined; public session: ISessionProperties<TConfig, TData>; constructor(extension: IExtension<TConfig, TData>, data: ISessionAuthProperties<TConfig, TData>){ this.extension = extension; this.session = data.session; this.role = data.role; } }
子类代码:
export class RandomEventSession extends Session<RandomEventConfig, RandomEventData>{ constructor(session: ISessionAuthProperties<RandomEventConfig, RandomEventData> ){ super(RandomEventExtension.Singleton, session) } async TriggerRandomEvent(){ } async TriggerEvent(){ } }
问题核心:子类中this.extension的类型被限定为IExtension<RandomEventConfig, RandomEventData>,无法访问RandomEventExtension的独有成员,但直接实现ISession接口又会导致重复编写抽象类中的通用逻辑。
解决方案:为抽象类增加Extension泛型参数
给抽象类Session新增一个泛型参数TExtension,让它继承自IExtension<TConfig, TData>,这样就能保留具体Extension的类型信息:
调整后的抽象类代码
export abstract class Session< TConfig extends object, TData extends object, TExtension extends IExtension<TConfig, TData> = IExtension<TConfig, TData> > implements ISession<TConfig, TData>{ public extension: TExtension; public role?: PartnerUserRoleEnum | undefined; public session: ISessionProperties<TConfig, TData>; constructor(extension: TExtension, data: ISessionAuthProperties<TConfig, TData>){ this.extension = extension; this.session = data.session; this.role = data.role; } }
调整后的子类代码
export class RandomEventSession extends Session< RandomEventConfig, RandomEventData, RandomEventExtension >{ constructor(session: ISessionAuthProperties<RandomEventConfig, RandomEventData> ){ super(RandomEventExtension.Singleton, session) } async TriggerRandomEvent(){ // 现在可以直接访问RandomEventExtension的独有方法 this.extension.specificMethod(); } async TriggerEvent(){ } }
说明
- 新增的
TExtension泛型参数让抽象类可以适配任意实现IExtension<TConfig, TData>的具体类,同时保留其类型信息 - 给
TExtension设置默认值IExtension<TConfig, TData>,确保原有继承方式依然兼容 - 子类继承时指定具体的Extension类型,就能在代码中直接访问该类的独有成员,无需类型断言
内容的提问来源于stack exchange,提问作者user13020816
相关产品推荐
相关产品推荐

