Typescript接口方法与抽象方法语法的区别

时间:2018-03-15 11:02:52

标签: typescript

无法理解为什么接口中的方法声明和抽象类中的抽象方法的语法不同

 interface Moveable {
      start: () => void;
      stop: () => void; // why it is not declared as stop(): void;
  }

  abstract class Vehicle implements Moveable {
      start(): void {
          console.log('Vehicle is moving');
      }
      stop(): void {
          console.log('Vehicle stopped');
      }
      abstract getModal(): void; // why it can not be not defined as getModal: () => void; as it is done for interface
  }

  class Car extends Vehicle {
      getModal() {
          console.log('get modal');
      }
      private test(): void {
          console.log("The car is being tested...");
      }
  }

1 个答案:

答案 0 :(得分:4)

两种语法之间存在差异。 std::array< std::array<int,3>, 3 > 声明恰好是函数的字段。 start: () => void;声明了一种方法。当你使用它们时,两者之间没有明显的区别,但是可以用它们做什么之间存在差异。

作为函数的接口字段可以通过类方法实现,但是您可以在接口中使用任一声明类型,这将实现相同的效果:

start(): void;

虽然您可以在抽象类中声明一个抽象字段,但它也必须由字段实现,但它不能通过方法实现:

interface Moveable {
    start():void;
    stop(): void; 
}

关于类型函数和方法的字段之间的区别,您应该记住,方法最终会在原型上结束,而字段最终会在实例上结束,因此在内存分配方面存在性能损失(对于简单的场景它不应该是一个问题,但如果你创建了很多实例,你可能会遇到麻烦)。对class CarNok extends Vehicle { getModal() { } // Error, Class 'Vehicle' defines instance member property 'getModal', but extended class 'CarNok' defines it as instance member function } class CarOk extends Vehicle { getModal: () => { } }

的情况也存在差异
this