首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >TypeScript:是否可以通过从抽象类中指定的类型继承的属性来实现抽象类属性?

TypeScript:是否可以通过从抽象类中指定的类型继承的属性来实现抽象类属性?
EN

Stack Overflow用户
提问于 2019-04-12 08:12:47
回答 1查看 304关注 0票数 0

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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'.

  • Type '()中的相同属性‘=> SignifcantEntity1’不能赋值给类型'SignificantEntity extends SignificantEntityParent>() => SignificantEntity1‘不能赋值给类型’getSignificantEntity entity‘。

我不明白TypeScript想告诉我什么。有没有在抽象类中使用significantEntity的有效方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-12 09:04:32

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

代码语言:javascript
复制
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,它同时用作声明和初始化:

代码语言:javascript
复制
class TestClass1 extends ParentClass {
    significantEntity = new SignificantEntity1();
}

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

好吧,希望这能帮上忙。祝好运!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55642773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档