# class(类)

面向对象实践 OOP 编程思想,在实际工作中,都是极其有用的抽象、封装利器。

class Person {
  name: string;
  say(this: Person, song: string): Person {
      console.log(song);
      return this;
  }
  constructor(name: string) {
    this.name = name;
  }
}

let p1 = new Person('张三');
p1.say('Song').name;

# 继承

使用extends关键字实现继承

class Male extends Person {
    age: number;
    constructor(name: string, age: number) {
        super(name);
        this.age = age;
    }
}

# 修饰符(public、private、protected、readonly)

在 TypeScript 中就支持 3 种访问修饰符,分别是 public、private、protected。通过这三个修饰符做到控制属性和方法的访问。

  • public:基类、子类、类外部都可以访问;
  • protected:基类、子类可以访问,类外部不可以访问;
  • private:基类可以访问,子类、类外部不可以访问;
  • readonly:只读修饰符
class Person {
    public readonly name: string = '张三';
    protected age: number = 20;
    private height: string = '180';
    protected getPersonInfo():void {
        console.log(this.name, this.age, this.height); // 基类里面三个修饰符都可以访问
    }
}

class Male extends Person {
    public getInfo():void {
        console.log(this.name, this.age); // 子类只能访问public、protected修饰符的
    }
}

let m = new Male();
console.log(m.name); // 类外部只能访问public修饰的
m.name = '李四'; // name属性使用只读修饰符,所以不能对name进行赋值修改操作

# 静态属性

基于静态属性的特性,往往会把与类相关的常量、不依赖实例 this 上下文的属性和方法定义为静态属性,从而避免数据冗余,进而提升运行性能。

class Person {
  static title: string = "个人信息";
}

Person.title;

# 抽象类和接口

抽象类,它是一种不能被实例化仅能被子类继承的特殊类。

abstract class Person {
  abstract name: string;
  abstract getName(): void;
  extendsFn():void {
    console.log('扩展方法');
  }
}

class Male extends Person {
  constructor(name: string) {
    super();
    this.name = name;
  }
  name: string;
  getName(): void {
    console.log(this.name);
  }
}

接口interface也可以约束类的实现,使用接口与使用抽象类相比,区别在于接口只能定义类成员的类型

interface Person {
  name: string;
  age: number;
  getName: () => void;
}

class Male implements Person {
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
  name: string;
  age: number;
  getName(): void {
    console.log(this.name);
  }
}

# 类的类型

在声明类的时候,其实也同时声明了一个特殊的类型(确切地讲是一个接口类型),这个类型的名字就是类名,表示类实例的类型。

class Male {
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
  name: string;
  age: number;
  getName(this: Male): void {
    console.log(this.name);
  }
}

let m1: Male = new Male("张三", 20);
let m2: Male = {
  name: "张三",
  age: 20,
  getName(this: Male) {
    console.log(this.name);
  },
};
m2.getName();
let fn = m2.getName;
fn(); // 报错,this指向并不是Male对象