角度:重载构造函数DRY

时间:2020-02-12 12:13:14

标签: angular typescript angular-components

假设我们有以下两个组成部分:

export class HeroComponent {
  constructor(
    public service1: Service1,
    public service2: Service2,
 ) {
   // do something
 }
}

export class AdvancedHeroComponent extends HeroComponent {
  constructor(
    public service1: Service1,
    public service2: Service2
  ) {
    super(service1, service2);
    // do something more
  }
}

有什么办法告诉Angular,除了复制粘贴它们之外,基类和扩展类的构造函数的参数是相同的吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

以下解决方案通常适用于TS,但不适用于Angular,因为Angular在TS top之上具有额外的编译器转换

您可以在函数参数/参数中使用rest和spread来使其正常工作。您还将需要 for f in Partners: prob += Partner_vars[f] <= Max[f] prob += Partner_vars[f] <= Min[f] 预定义类型以从基本构造函数中提取原始参数类型:

Parameters

Playground Link

注意:您不需要在派生类型参数中使用export class HeroComponent { constructor( public service1: Service1, public service2: Service2, ) { // do something } } export class AdvancedHeroComponent extends HeroComponent { constructor( ...p: ConstructorParameters<typeof HeroComponent> ) { super(...p); // do something more } } 修饰符。该字段已经在基本类型上声明,因此多余的public会重新声明该字段。这实际上可能导致publicprivate字段出现问题。

答案 1 :(得分:1)

您可以提取“更多操作”逻辑并在子类中覆盖:

class IHasApiKey
{
private:
    std::string _apiKey = "";
protected:
    IHasApiKey(const std::string& apiKey) : _apiKey(apiKey) {}

    // tbo, I'm not quite sure about how to optimally write this one,
    // but the idea is the same: provide protected read access.
    const std::string& GetKey() { return const_cast<std::string&>(_apiKey); }
};
export class HeroComponent {
  constructor(
    public service1: Service1,
    public service2: Service2,
 ) {
   // do something
   this.doSomethingMore();
 }

  protected doSomethingMore() {}
}