类就是用来创造对象的东西。

有一些语言创建对象必须先声明一个类,而有的语言则不需要。

类可以让你的程序更加「可预测」。

这个创造出来的对象不会出现一些我不知道的属性,一切都尽在我的掌握。

语法

声明类

声明对象的非函数属性

声明对象的函数属性

使用 constructor

声明类的属性(static)

使用 this 代指当前对象(注意不要以为 this 永远都代指当前对象,JS 的 this 有更多功能,而且默认 this 为 window)

类继承类(extends)

继承要使用 super

修饰符(public,private,和 protected)

public 是默认的,任何地方可见。

protected 只有自己(类)及子类可见。

private 只有自己(类)可见。

访问器

get 和 set

设置后访问指定属性会通过这两个函数。

抽象类

专门当别的类的爸爸的类。

也可以叫做「爸爸类」:专门当别的类的爸爸的类。

也可以叫做「没有写完的类」:只描述有什么方法,并没有完全实现这些方法。

由于这个类没有写完,所以不能创建出对象。(会报错)

abstract 就是抽象的意思。

abstract class Animal {
  abstract makeSound(): void;
  move(): void {
    console.log('roaming the earch...');
  }
}

高级技巧

由于 TS 的 class 其实就是 JS 里的 class,JS 里的 class 其实就是一个构造函数。

换句话说,类就是一个函数。

同时,函数在 JS 里,是一种对象。

所以类其实是一种对象。

class Greeter {
  static standardGreeting = "Hello, there";
  greeting: string;
  greet() {
    if (this.greeting) {
      return "Hello, " + this.greeting;
    }
    else {
      return Greeter.standardGreeting;
    }
  }
}

let greeter1: Greeter;
greeter1 = new Greeter();
console.log(greeter1.greet());

let greeterMaker: typeof Greeter = Greeter;  // 注意这句话
greeterMaker.standardGreeting = "Hey there!";

let greeter2: Greeter = new greeterMaker();
console.log(greeter2.greet());

把类当做接口使用

接口是低配版的类。

类是高配版的接口。

class Point {
  x: number;
  y: number;
}

interface Point3d extends Point {
  z: number;
}

let point3d: Point3d = {x: 1, y: 2, z: 3};