函数继承相对于 类 来说,缺点有两个:麻烦、在 ts 中缺少类型的检查。

继承

  1. class Animal {
  2. type = 'Animal';
  3. say(name: string) {
  4. console.log(`I'm ${name}!`);
  5. }
  6. }
  7. class Dog extends Animal {
  8. bark() {
  9. console.log('Woof! Woof!');
  10. }
  11. }
  12. const dog = new Dog();
  13. dog.bark(); // => 'Woof! Woof!'
  14. dog.say('Q'); // => I'm Q!
  15. dog.type; // => Animal

公共、私有与受保护的修饰符

  • public 修饰的是在任何地方可见、公有的属性或方法;
  • private 修饰的是仅在同一类中可见、私有的属性或方法;
  • protected 修饰的是仅在类自身及子类中可见、受保护的属性或方法。

1. private

TypeScript 中定义类的私有属性仅仅代表静态类型检测层面的私有。如果我们强制忽略 TypeScript 类型的检查错误,转译且运行 JavaScript 时依旧可以获取到 lastName 属性,这是因为 JavaScript 并不支持真正意义上的私有属性。

目前,JavaScript 类支持 private 修饰符的提案已经到 stage 3 了。相信在不久的将来,私有属性在类型检测和运行阶段都可以被限制为仅在类的内部可见。可以在proposal-private-methods中进行查看。

2. protected

虽然我们不能通过派生类的实例访问protected修饰的属性和方法,但是可以通过派生类的实例方法进行访问。

3. 只读修饰符

属性不能被修改。

  1. public readonly firstName: string;

4. 存取器

通过getter、setter截取对类成员的读写访问。

  1. class GrandSon extends Son {
  2. constructor(firstName: string) {
  3. super(firstName);
  4. }
  5. get myLastName() {
  6. return this.lastName;
  7. }
  8. set myLastName(name: string) {
  9. if (this.firstName === 'Tony') {
  10. this.lastName = name;
  11. } else {
  12. console.error('Unable to change myLastName');
  13. }
  14. }
  15. }

5. 静态属性

定义类的属性和方法

  1. class MyArray {
  2. static displayName = 'MyArray';
  3. static isArray(obj: unknown) {
  4. return Object.prototype.toString.call(obj).slice(8, -1) === 'Array';
  5. }
  6. }
  7. console.log(MyArray.displayName); // => "MyArray"
  8. console.log(MyArray.isArray([])); // => true
  9. console.log(MyArray.isArray({})); // => false

6. 抽象类

不能被实例化仅能被子类继承的特殊类。

  1. abstract class Animal {
  2. }

类的类型

申明函数,就定义了一个特殊的类型,类类型。这个类型的成员就是处了构造函数之前的属性、方法。