【问题标题】:How to pass a service from a child to a parent?如何将服务从孩子传递给父母?
【发布时间】:2020-07-29 19:32:10
【问题描述】:

我希望通过 super() 传递一个注入的微服务;调用父类。

抽象顶级父类:

export abstract class Crypto {
  constructor() {
  }
}

2 个子类:

export class BTC extends Crypto {
  constructor(
    @Inject('COIN_API_SERVICE')
    private readonly apiService: ClientProxy, // this is an external microservice
  ) {
    super();
  }
}

export class ETH extends Crypto {

  constructor(
    @Inject('COIN_API_SERVICE')
    private readonly apiService: ClientProxy,
  ) {
    super();
  }
}

还有一个子类的子类:

export class ERC20Token extends ETH {

  constructor(
    @Inject('COIN_API_SERVICE')
    private readonly apiService: ClientProxy,
  ) {
    super();
  }
}

由于所有 ERC20 类的工作方式都与 ETH 实例完全一样,只是做了一些调整,因此从 ETH 扩展它是有意义的。但是,尝试编译此代码最终会出现以下错误:

TS2415:“ERC20Token”类错误地扩展了基类“ETH”。类型具有私有属性“apiService”的单独声明。

但是我需要同时创建 ETH 和 ERC20 Token 的实例,所以两者都需要有一个 apiService。如何解决这个问题?

【问题讨论】:

    标签: typescript inheritance nestjs


    【解决方案1】:

    一种选择是使用工厂,以便为工厂注入所有依赖项。因此,通过工厂创建的对象。

    工厂的构造函数看起来有点像这样:

    constructor(
        @Inject('COIN_API_SERVICE')
        private readonly apiService: ClientProxy,
        coinType: CoinType,
    ) {
    }
    

    然后您可以使用注入的 API 服务和硬币类型来实例化硬币。

    如果你只想让子构造函数编译,你可以看看可选的装饰器:https://docs.nestjs.com/providers#optional-providers

    【讨论】:

      【解决方案2】:

      将源类的apiService 设为受保护:

      export class ETH extends Crypto {
      
        constructor(
          @Inject('COIN_API_SERVICE')
          protected readonly apiService: ClientProxy,
        ) {
          super();
        }
      }
      

      并从 child 传递 super 中的服务实例:

      export class ERC20Token extends ETH {
      
        constructor(
          @Inject('COIN_API_SERVICE')
          protected readonly apiService: ClientProxy,
        ) {
          super(apiService);
        }
      }
      

      【讨论】:

      • 恐怕这会产生另一个错误:TS2415:“ERC20Token”类错误地扩展了基类“ETH”。属性“apiService”在“ERC20Token”类型中是私有的,但在“ETH”类型中不是私有的。
      • 哦,孩子也应该受到保护
      猜你喜欢
      • 1970-01-01
      • 2020-07-22
      • 2021-10-31
      • 2022-11-21
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      相关资源
      最近更新 更多