当前位置:  开发笔记 > 编程语言 > 正文

打字稿无法识别父类的属性?

如何解决《打字稿无法识别父类的属性?》经验,为你挑选了1个好方法。

我有一个基本的遗产,如下:

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变得undefinedHello world.

如果我想补充public abstract prop: any;A,同样的事情发生.

使用抽象类的整个继承点是共享this范围.

如何使用Typescript正确完成?



1> Alex..:

我同意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问题,解决方案是在抽象类的构造函数中访问抽象属性时出错.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有