abstract 用于定义抽象类和其中的抽象方法。app
什么是抽象类?this
首先,抽象类是不容许被实例化的:spa
abstract class Animal { public name; public constructor(name) { this.name = name; } public abstract sayHi(); } let a = new Animal('Jack'); // index.ts(9,11): error TS2511: Cannot create an instance of the abstract class 'Animal'.
上面的例子中,咱们定义了一个抽象类 Animal,而且定义了一个抽象方法 sayHi。在实例化抽象类的时候报错了。prototype
其次,抽象类中的抽象方法必须被子类实现:code
abstract class Animal { public name; public constructor(name) { this.name = name; } public abstract sayHi(); } class Cat extends Animal { public eat() { console.log(`${this.name} is eating.`); } } let cat = new Cat('Tom'); // index.ts(9,7): error TS2515: Non-abstract class 'Cat' does not implement inherited abstract member 'sayHi' from class 'Animal'.
上面的例子中,咱们定义了一个类 Cat 继承了抽象类 Animal,可是没有实现抽象方法 sayHi,因此编译报错了。blog
下面是一个正确使用抽象类的例子:继承
abstract class Animal { public name; public constructor(name) { this.name = name; } public abstract sayHi(); } class Cat extends Animal { public sayHi() { console.log(`Meow, My name is ${this.name}`); } } let cat = new Cat('Tom');
上面的例子中,咱们实现了抽象方法 sayHi,编译经过了。ip
须要注意的是,即便是抽象方法,TypeScript 的编译结果中,仍然会存在这个类,上面的代码的编译结果是:it
var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var Animal = (function () { function Animal(name) { this.name = name; } return Animal; }()); var Cat = (function (_super) { __extends(Cat, _super); function Cat() { _super.apply(this, arguments); } Cat.prototype.sayHi = function () { console.log('Meow, My name is ' + this.name); }; return Cat; }(Animal)); var cat = new Cat('Tom');