You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确定注入属性的具体类型?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 02:55:25