我有一个基本的遗产,如下:
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!
Run Code Online (Sandbox Code Playgroud)
我试图让上述代码片段正常运行时遇到问题.Property prop does not exist on type A
.但是,它确实存在于B上,并且因为它是公开的,所以A应该能够到达prop via this.prop
.
我尝试了以下方法:
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!
Run Code Online (Sandbox Code Playgroud)
TS 2.0提供了定义抽象属性的能力:https://github.com/Microsoft/TypeScript/issues/4669
更新
这种方法遇到的问题,参见注释,是抽象属性是在抽象基类的构造函数中使用的.这将不起作用,因为在实例化对象之后首先从派生类中为属性分配初始值.
这个问题有一个github问题,解决方案是在抽象类的构造函数中访问抽象属性时出错.
归档时间: |
|
查看次数: |
6733 次 |
最近记录: |