【问题标题】:TypeScript: Is it possible to implement abstract class property by property inherited from type specified in abstract one?TypeScript:是否可以通过从抽象类中指定的类型继承的属性来实现抽象类属性?
【发布时间】:2019-09-02 16:42:30
【问题描述】:

下面代码中的抽象类ParentClass需要使用抽象属性significantEntity(这是类上的实例,继承自抽象SignificantEntityParent)。当然,下面的代码是无效的,因为significantEntity 实现的类型与SignificantEntityParent 不同。

abstract class SignificantEntityParent {}
class SignificantEntity1 extends SignificantEntityParent {}
class SignificantEntity2 extends SignificantEntityParent {}

abstract class ParentClass {

  protected abstract significantEntity: SignificantEntityParent;

  public testMethod(): void {
    console.log(this.significantEntity);
  }
}

class TestClass1 extends ParentClass {
  constructor() {
    super();
    // invalid!
    this.significantEntity = new SignificantEntity1();
  }
}

class TestClass2 extends ParentClass {
  constructor() {
    super();
    // invalid!
    this.significantEntity = new SignificantEntity2();
  }
}

我尝试过使用抽象泛型方法getSignificantEntity<SignificantEntity extends SignificantEntityParent>(): SignificantEntity

abstract class ParentClassA {

  protected abstract getSignificantEntity<SignificantEntity extends SignificantEntityParent>(): SignificantEntity;

  public logSignificantEntity(): void {
    console.log(this.getSignificantEntity());
  }
}

class TestClassA1 extends ParentClassA {

  private significantEntity: SignificantEntity1;

  constructor() {
    super();
    this.significantEntity = new SignificantEntity1();
  }

  protected getSignificantEntity(): SignificantEntity1 {
     return this.significantEntity;
  }
}

class TestClassA2 extends ParentClassA {

  private significantEntity: SignificantEntity2;

  constructor() {
    super();
    this.significantEntity = new SignificantEntity2();
  }

  protected getSignificantEntity(): SignificantEntity2 {
    return this.significantEntity;
  }
}

我收到很多错误:

  • TS2416:“TestClassA”类型中的属性“getSignificantEntity”不能分配给基类型“ParentClassA”中的相同属性。
  • 类型 '() => SignifcantEntity1' 不可分配给类型 'SignificantEntity extends SignificantEntityParent>() => SignificantEntity'。
  • 类型“SignificantEntity1”不可分配给类型“重要实体”。

我无法理解 TypeScript 试图告诉我什么。在抽象类中使用significantEntity 是否有有效的方法?

【问题讨论】:

    标签: typescript inheritance


    【解决方案1】:

    可能没有明确记录,但abstract classes 的抽象属性和方法必须在具体子类中声明;它们不能只是使用。这意味着您可以通过添加具体的属性声明来修复您的第一个示例:

    class TestClass1 extends ParentClass {
        significantEntity: SignificantEntity1; // declaration   
        constructor() {
            super();
            this.significantEntity = new SignificantEntity1();
        }
    }
    
    class TestClass2 extends ParentClass {
        significantEntity: SignificantEntity2; // declaration
        constructor() {
            super();
            this.significantEntity = new SignificantEntity2();
        }
    }
    

    当然,如果你在构造函数中所做的只是初始化一个属性,你可以删除构造函数并使用显式的property initializer,它既可以作为声明也可以作为初始化:

    class TestClass1 extends ParentClass {
        significantEntity = new SignificantEntity1();
    }
    
    class TestClass2 extends ParentClass {
        significantEntity= new SignificantEntity2();
    }
    

    好的,希望对您有所帮助。祝你好运!

    【讨论】:

    • 你的回答真的很有帮助!谢谢你的解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 2021-05-03
    相关资源
    最近更新 更多