Bootstrap

TypeScript -类的知识点详解

TypeScript -类的知识点详解

在 TypeScript 中,类(Classes)的概念与面向对象编程中的类相似,提供了一种创建和管理对象的方式。以下是 TypeScript 中类的详细知识点:

1. 定义类

类是通过关键字 class 来定义的,它可以包含属性、方法和构造函数:

class Person {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  greet() {
    console.log(`Hello, my name is ${this.name}`);
  }
}

2. 继承

TypeScript 支持类的继承,使用 extends 关键字:

class Employee extends Person {
  jobTitle: string;

  constructor(name: string, age: number, jobTitle: string) {
    super(name, age); // 调用父类的构造函数
    this.jobTitle = jobTitle;
  }

  describe() {
    console.log(`${this.name} is a ${this.age} year old ${this.jobTitle}.`);
  }
}

3. 访问修饰符

TypeScript 中的类成员可以有三种访问修饰符:public(默认)、privateprotected

class Person {
  public name: string;
  private age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  public greet() {
    console.log(`Hello, my name is ${this.name}`);
  }

  protected describe() {
    console.log(`I am ${this.age} years old.`);
  }
}

4. 抽象类

使用 abstract 关键字可以定义一个抽象类,它不能被实例化,并且可以包含抽象方法,这些方法没有实现,必须由子类提供实现:

abstract class Animal {
  abstract makeSound(): void;
}

class Dog extends Animal {
  makeSound() {
    console.log("Woof woof");
  }
}

5. 静态属性和方法

使用 static 关键字可以定义类的静态属性和方法,它们不属于类的实例,而是属于类本身:

class Person {
  static count = 0;

  constructor(public name: string) {
    Person.count++;
  }
}

6. 属性初始化器

在类的属性声明中,可以直接初始化属性:

class Person {
  name = "Kimi";
  age = 30;

  greet() {
    console.log(`Hello, my name is ${this.name}`);
  }
}

7. 构造函数和参数属性

在 TypeScript 中,你可以在类的属性声明中直接包含参数属性,这样可以使代码更简洁:

class Person {
  constructor(public name: string, public age: number) {}

  greet() {
    console.log(`Hello, my name is ${this.name}`);
  }
}

8. 存取器(Getters/Setters)

TypeScript 支持使用 getset 关键字来定义存取器:

class Person {
  private _age: number;

  constructor(age: number) {
    this._age = age;
  }

  get age(): number {
    return this._age;
  }

  set age(value: number) {
    if (value < 0) {
      throw new Error("Age cannot be negative");
    }
    this._age = value;
  }
}

9. 类表达式

类也可以在表达式中定义,这在创建匿名类时非常有用:

const Person = class {
  name: string;

  constructor(name: string) {
    this.name = name;
  }

  greet() {
    console.log(`Hello, my name is ${this.name}`);
  }
};

const kimi = new Person("Kimi");
kimi.greet();

10. 类和接口

类可以实现接口,确保类满足接口定义的结构:

interface Greet {
  greet(): void;
}

class Person implements Greet {
  constructor(public name: string) {}

  greet() {
    console.log(`Hello, my name is ${this.name}`);
  }
}

11. 类的装饰器

TypeScript 支持装饰器,这是一种特殊类型的声明,它可以被附加到类声明、方法、访问器、属性或参数上:

function classDecorator<T extends { new(...args: any[]): {} }>(constructor: T) {
  return class extends constructor {
    name: string = "Kimi";
  };
}

@classDecorator
class Greeter {
  greet() {
    console.log(`Hello, my name is ${this.name}`);
  }
}

类是 TypeScript 中实现面向对象编程的核心概念之一,它们提供了一种封装数据和行为的方式,使得代码更加模块化和可重用。通过使用类,你可以创建复杂的对象模型,并且利用继承、多态和封装等面向对象编程的特性。

;