【问题标题】:Angular Service - Subclass Constructor Required or Can't resolve all parameters for ClassName (?)Angular Service - 需要子类构造函数或无法解析 ClassName 的所有参数(?)
【发布时间】:2019-05-20 14:50:34
【问题描述】:

最近,我正在研究一组都继承自 Service 基类的服务。基类采用 HttpClient 的构造函数 (DI) 参数。

当对子类使用自动完成时,我可以看到它们的构造函数参数正确地解释了基类需要HttpClient 的事实。但是,除非我在子类中明确放置一个虚拟构造函数,否则 Angular 在运行时会抱怨以下内容:

错误:无法解析 MyService 的所有参数:(?)。

为什么我在子类中需要一个无用的构造函数?

注意我的代码结构如下:

export abstract class MyBaseService {

    constructor(protected http: HttpClient) {     }

    ...
}

export class MyService extends MyBaseService {

    constructor(http: HttpClient) {     
      super(http);   // don't understand why we need this...
    }

    ...
}

注意:这似乎与抽象类密切相关;普通类的子类似乎没有表现出这种行为。

【问题讨论】:

  • 为简洁起见省略了导入,但您可以假设所有编译都正确。

标签: angular typescript


【解决方案1】:

我们遇到了同样的问题,解决方案是(有点违反直觉)用 Injectable() 装饰器装饰 基类 定义。示例:

import { Injectable } from '@angular/core';

@Injectable()
export abstract class MyBaseService {

    constructor(protected http: HttpClient) {     }

    // ...
}

export class MyService extends MyBaseService {

    // ? A constructor is no longer required!

    // ...
}

装饰器使 TypeScript 编译器发出包含一些类型元数据的 JavaScript 代码,否则这些元数据会丢失。 Angular JIT 编译器(与 Angular AOT 编译器不同)需要这些元数据来解决问题。

我从 Angular repo 上的 this helpful GitHub issue thread 了解到这一点。

【讨论】:

    【解决方案2】:

    您是否尝试过删除 MyService 类中的构造函数?
    我已经遇到了同样的问题,但它是针对组件的。
    在这种情况下,我使用了以下解决方案:

    MyBaseService 如下所示。

    export abstract class MyBaseService {
    
        constructor(
          @Injectable(HttpClient) protected http: HttpClient
        ){}
    
        ...
    }
    

    MyService 类的结果如下:

    export class MyService extends MyBaseService {
        // do something here
    }
    

    试试这个,如果不行,告诉我

    【讨论】:

    • 我不确定我是否遵循 - 你是说摆脱构造函数提供的参数并直接注入它们吗?我可以这样做...但我仍然想知道我不理解的情况。
    • 我不是 100% 确定是不是这样,但是“HttpClient”就像一个类依赖项,所以为了防止所有子类在不使用它们的情况下声明,直接从父亲班。同样,我不完全确定就是这样。
    • 这是我遇到这个问题时找到的最合适的解决方案
    猜你喜欢
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    相关资源
    最近更新 更多