TypeScript访问基类的成员

请参阅TypeScript站点上操场的inheritance示例:

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()中的警报。 在那里我想要访问“super.name”,但是这只返回undefined。 智能感知是build议我可以使用它和TypeScript编译好,但它不工作。 有任何想法吗?

工作示例。 下面的注释。

 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. 您不需要手动将名称分配给公共variables。 在构造函数定义中使用public name为你做这个。

  2. 你不需要从专门的课程中调用super(name)

  3. 使用this.name工作。

关于使用super注意事项。

这在语言规范的第4.8.2节中有更详细的介绍。

Animalinheritance的类的行为与其他语言的行为没有什么不同。 您需要指定super关键字以避免专用函数和基类函数之间的混淆。 例如,如果你调用move()this.move()你将会处理专门的SnakeHorse函数,所以使用super.move()明确地调用基类函数。

属性没有混淆,因为它们是实例的属性。 super.namethis.name没有什么区别 – 只有this.name 。 否则,您可以创build一个具有不同名称的Horse,具体取决于您是在专门的类还是在基类中。