下面代码中的抽象类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'.
我不明白TypeScript想告诉我什么。有没有在抽象类中使用significantEntity
的有效方法?
发布于 2019-04-12 09:04:32
它可能没有明确的文档记录,但是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();
}
好吧,希望这能帮上忙。祝好运!
https://stackoverflow.com/questions/55642773
复制相似问题