请参见TypeScript网站上playground 的继承示例:

class Animal {
  public name;
  constructor(name) {
    this.name = name;
  }
  move(meters) {
    alert(this.name + " moved " + meters + "m.");
  }
}

class Snake extends Animal {
  constructor(name) {
    super(name);
  }
  move() {
    alert("Slithering...");
    super.move(5);
  }
}

class Horse extends Animal {
  constructor(name) {
    super(name);
  }
  move() {
    alert(super.name + " is Galloping...");
    super.move(45);
  }
}

var sam = new Snake("Sammy the Python");
var tom: Animal = new Horse("Tommy the Palomino");

sam.move();
tom.move(34);

我更改了一行代码:Horse.move()中的alert .我想访问super.name,但返回的是undefined.IntelliSense建议我可以使用它,TypeScript编译得很好,但它不起作用.

有什么 idea 吗?

推荐答案

工作示例.下面是注释.

class Animal {
    constructor(public name) {
    }

    move(meters) {
        alert(this.name + " moved " + meters + "m.");
    }
}

class Snake extends Animal {
    move() {
        alert(this.name + " is Slithering...");
        super.move(5);
    }
}

class Horse extends Animal {
    move() {
        alert(this.name + " is Galloping...");
        super.move(45);
    }
}

var sam = new Snake("Sammy the Python");
var tom: Animal = new Horse("Tommy the Palomino");

sam.move();
tom.move(34);
  1. 不需要手动将名称分配给公共变量.在构造函数定义中使用public name可以实现这一点.

  2. 你不需要在专业课上打super(name).

  3. 使用this.name个作品.

关于使用super的注释.

这在语言规范的第section 4.9.2章中有更详细的介绍.

继承自Animal的类的行为与其他语言中的行为并无不同.您需要指定super关键字,以避免混淆专用函数和基类函数.例如,如果您调用move()this.move(),您将处理专门的SnakeHorse函数,因此使用super.move()显式调用基类函数.

属性没有混淆,因为它们是实例的属性.super.namethis.name之间没有区别——只有this.name.否则,您可以创建一个具有不同名称的马,这取决于您是在专用类中还是在基类中.

Typescript相关问答推荐

自定义挂钩上的React useState正在忽略提供的初始状态

了解TS类型参数列表中的分配

用泛型类型覆盖父类函数导致类型y中的Property x不能赋给基类型Parent中的相同属性."'''''' "

如何用不同的键值初始化角react 形式

角形标题大小写所有单词除外

将对象属性转换为InstanceType或原样的强类型方法

异步动态生成Playwright测试,显示未找到测试

为什么在这个例子中,我把缺少的属性添加到对象中时,TypeScrip没有拾取,如何修复?

是否可以从函数类型中创建简化的类型,go 掉参数中任何看起来像回调的内容,而保留其余的内容?

错误TS2403:后续变量声明必须具有相同的类型.变量';CRYPTO';的类型必须是';CRYPATO';,但这里的类型是';CRYPATO';

从route.参数获取值.订阅提供";无法读取未定义";的属性

带投掷的收窄类型

将布尔值附加到每个对象特性

推断集合访问器类型

为什么`map()`返回类型不能维护与输入相同数量的值?

我如何键入它,以便具有字符串或数字构造函数的数组可以作为字符串或数字键入s或n

在对象数组中设置值

如何避免TS2322;类型any不可分配给类型never;使用索引访问时

为什么过滤器不改变可能的类型?

传入类型参数<;T>;变容函数