ts-class

class 类

属性
构造函数,只会在new 的时候被调用,且调用一次

方法

继承

  1. 子类包含了构造函数,它必须调用super(),它会执行基类的构造函数。在构造函数里访问this之前一定要调用super()

  2. super还可调用父类的其它方法

访问修饰符

  • 默认public
  • private: 不能在声明它的类的外部访问
1
2
3
4
5
6
7
class Animal {
private name: string;
constructor(theName: string) {
this.name = theName;
}
}
new Animal("Cat").name; // 错误: 'name' 是私有的.
  • public:
    • 在类的外部不能访问,但是在派生类的内部可以访问。
    • 构造函数标记protected,这意味着这个类不能在包含它的类外被实例话,但是能被继承。

readonly

只读属性必须在声明时或构造函数里初始化。

1
2
3
4
5
6
7
8
9
class Octopus {
readonly name: string;
readonly numberOfLegs: number = 8;
constructor (theName: string) {
this.name = theName;
}
}
let dad = new Octopus("Man with the 8 strong legs");
dad.name = "Man with the 3-piece suit"; // 错误! name 是只读的.

参数属性

参数属性通过给构造函数参数添加一个访问限定符来声明。 使用 private限定一个参数属性会声明并初始化一个私有成员;对于 public和 protected来说也是一样。

1
2
3
4
5
6
class Animal {
private name: string;
constructor(theName: string) {
this.name = theName;
}
}
1
2
3
4
5
6
7
class Animal {
constructor(private name: string){
}
move(distanceInMeters: number) {
console.log(`${this.name} moved ${distanceInMeters}m.`);
}
}

存取器

带有 get不带有 set的存取器自动被推断为 readonly。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
let passcode = "secret passcode";

class Employee {
private _fullName: string;

get fullName(): string {
return this._fullName;
}

set fullName(newName: string) {
if (passcode && passcode == "secret passcode") {
this._fullName = newName;
}
else {
console.log("Error: Unauthorized update of employee!");
}
}
}

let employee = new Employee();
employee.fullName = "Bob Smith";
if (employee.fullName) {
alert(employee.fullName);
}

static静态属性

通过类名直接访问,不需要实例化

abstract抽象类

  • 作为其它派生类的基类使用,一般不直接实例化。不同于接口,抽象类可以包含成员的实现细节。

  • 抽象类中的抽象方法不包含具体实现并且必须在派生类中实现。

  • 抽象方法的语法与接口方法相似。 两者都是定义方法签名但不包含方法体。

然而,抽象方法必须包含 abstract关键字并且可以包含访问修饰符。

高级技巧

构造函数

声明一个类的时候,首先就声明是类的实例的类型。

1
let someClass: SomeClass

这里,let Greeter将被构造函数赋值。我们可以通过new 来初始化构造函数,得到一个类的实例。这个构造函数同样包含了这个类的静态部分,所以类可以分为实例部分静态部分(构造函数)

##把类当做接口使用