我有一个基本的遗产,如下:
export abstract class Animal { constructor() { } makeSound() { alert(this.sound); } } export class Dog extends Animal { public sound: string = "Woof!"; constructor() { super(); } } const dog = new Dog; dog.makeSound(); // Woof!
我试图让上述代码片段正常运行时遇到问题.Property prop does not exist on type A
.但是,它确实存在于B上,并且因为它是公开的,所以A应该能够到达prop via this.prop
.
我尝试了以下方法:
与上面相同 - 它不编译.(A类不存在物业道具)
如果我想补充public prop: any;
到A
,然后prop
变得undefined
不Hello world
.
如果我想补充public abstract prop: any;
到A
,同样的事情发生.
使用抽象类的整个继承点是共享this
范围.
如何使用Typescript正确完成?
我同意JB Nizet的观点.但您也可以将其定义sound
为抽象属性.这样你的基类就知道了sound
,所有扩展类都必须实现abstract属性sound
:
export abstract class Animal { abstract sound: string; // Only change here, now your code works constructor() { } makeSound() { alert(this.sound); } } export class Dog extends Animal { public sound: string = "Woof!"; constructor() { super(); } } const dog = new Dog; dog.makeSound(); // Woof!
TS 2.0提供了定义抽象属性的能力:https://github.com/Microsoft/TypeScript/issues/4669
更新
这种方法遇到的问题,参见注释,是抽象属性是在抽象基类的构造函数中使用的.这将不起作用,因为在实例化对象之后首先从派生类中为属性分配初始值.
这个问题有一个github问题,解决方案是在抽象类的构造函数中访问抽象属性时出错.