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

Angular 5继承带依赖注入类时的TypeScript类型错误求助

无需同时注入两个服务!这里有几种解决方案

你遇到的错误是TypeScript类型检查导致的:父类FooService中_bar的类型被声明为BarService,尽管你实际注入的是子类ExtBarService,但TypeScript只会按照父类的类型定义做校验,因此它无法识别子类特有的myBarVar属性。

以下是几种不需要额外注入BarService的解决办法:

1. 泛型父类(推荐,长期维护更友好)

将FooService改造为泛型类,让子类可以指定具体的BarService子类类型,这样TypeScript就能正确推断_bar的实际类型:

@Injectable()
class FooService<T extends BarService = BarService> {
    constructor(protected _bar: T) {}
}

@Injectable()
class ExtFooService extends FooService<ExtBarService> {
    constructor(_bar: ExtBarService) {
        super(_bar);
    }

    someMethod() {
        return {
            key: this._bar.myBarVar // 类型检查完全通过
        };
    }
}

2. 子类重写属性类型

在ExtFooService中重新声明_bar属性,指定为ExtBarService类型(TypeScript 4.3及以上版本需要添加override关键字):

@Injectable()
class ExtFooService extends FooService {
    protected override _bar: ExtBarService;

    constructor(_bar: ExtBarService) {
        super(_bar);
    }

    someMethod() {
        return {
            key: this._bar.myBarVar
        };
    }
}

3. 临时类型断言

如果只是临时解决问题,不想修改类的结构,可以在访问属性时用类型断言明确告诉TypeScript_bar的实际类型:

@Injectable()
class ExtFooService extends FooService {
    constructor(_bar: ExtBarService) {
        super(_bar);
    }

    someMethod() {
        return {
            key: (this._bar as ExtBarService).myBarVar
        };
    }
}

为什么不需要注入两个服务?

ExtBarService继承自BarService,它完全包含了父类的所有功能和依赖,注入ExtBarService一个实例就足以满足FooService的依赖需求,同时能让你访问子类特有的属性和方法。

内容的提问来源于stack exchange,提问作者Sampgun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:15:35