返回

TypeScript 中的类和修饰符:揭秘更高级的类型系统

前端






## **TypeScript 中的类和修饰符** 

在本章中,我们将探讨 TypeScript 中的类和修饰符,了解它们如何帮助我们构建更强大、更灵活的类型系统。

### **类** 

类是 TypeScript 中用来表示对象的蓝图。它定义了对象的属性和方法,并提供了创建新对象的机制。

```typescript
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} and I am ${this.age} years old.`);
  }
}

在这个例子中,Person 类定义了两个属性:nameage,以及一个方法:greet()

修饰符

修饰符用于控制类的成员(属性和方法)的访问权限。有以下几种修饰符:

  • public:表示该成员可以在类的任何地方访问。
  • protected:表示该成员只能在类及其子类中访问。
  • private:表示该成员只能在类内部访问。
class Person {
  public name: string;
  protected age: number;
  private _secret: string;

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

  greet() {
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
  }

  getSecret() {
    return this._secret;
  }
}

在这个例子中,name 是一个公共属性,可以在类的任何地方访问。age 是一个受保护的属性,只能在类及其子类中访问。_secret 是一个私有属性,只能在类内部访问。

访问控制

访问控制是 TypeScript 中的一个重要概念,它用于控制对类成员的访问。有以下几种访问控制级别:

  • public:表示该成员可以在类的任何地方访问。
  • protected:表示该成员只能在类及其子类中访问。
  • private:表示该成员只能在类内部访问。
class Person {
  public name: string;
  protected age: number;
  private _secret: string;

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

  greet() {
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
  }

  getSecret() {
    return this._secret;
  }
}

class Employee extends Person {
  salary: number;

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

  getSalary() {
    return this.salary;
  }
}

const person = new Person('John Doe', 30, 'I am a secret');
console.log(person.name); // "John Doe"
console.log(person.age); // Error: Property 'age' is protected and only accessible within class 'Person' and its subclasses.
console.log(person.getSecret()); // Error: Property '_secret' is private and only accessible within class 'Person'.

const employee = new Employee('Jane Doe', 25, 'I am also a secret', 100000);
console.log(employee.name); // "Jane Doe"
console.log(employee.age); // Error: Property 'age' is protected and only accessible within class 'Person' and its subclasses.
console.log(employee.salary); // 100000
console.log(employee.getSecret()); // Error: Property '_secret' is private and only accessible within class 'Person'.

在这个例子中,name 是一个公共属性,可以在类的任何地方访问。age 是一个受保护的属性,只能在类及其子类中访问。_secret 是一个私有属性,只能在类内部访问。

继承

继承是 TypeScript 中的一个重要概念,它允许一个类从另一个类继承属性和方法。

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} and I am ${this.age} years old.`);
  }
}

class Employee extends Person {
  salary: number;

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

  getSalary() {
    return this.salary;
  }
}

const person = new Person('John Doe', 30);
console.log(person.name); // "John Doe"
console.log(person.age); // 30
console.log(person.salary); // Error: Property 'salary' does not exist on type 'Person'.

const employee = new Employee('Jane Doe', 25, 100000);
console.log(employee.name); // "Jane Doe"
console.log(employee.age); // 25
console.log(employee.salary); // 100000
console.log(employee.getSalary()); // 100000

在这个例子中,Employee 类从 Person 类继承了 nameage 属性,以及 greet() 方法。Employee 类还定义了一个新的属性 salary 和一个新的方法 getSalary()

多态性

多态性是 TypeScript 中的一个重要概念,它允许对父类对象进行操作,而无需知道其具体类型。

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} and I am ${this.age} years old.`);
  }
}

class Employee extends Person {
  salary: number;

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

  getSalary() {
    return this.salary;
  }
}

const person = new Person('John Doe', 30);
const employee = new Employee('Jane Doe', 25, 100000);

function greetAll(people: Person[]) {
  for (const person of people) {
    person.greet();
  }
}

greetAll([person, employee]);

在这个例子中,greetAll() 函数接受一个 Person[] 数组作为参数,并调用每个 Person 对象的 greet() 方法。即使 employee 对象是 Employee 类的实例,它仍然可以被 greetAll() 函数调用,因为 Employee 类继承了 Person 类。

结语

在本章中,我们学习了 TypeScript 中的类和修饰符,了解了它们如何帮助我们构建更强大、更灵活的类型系统。我们还探讨了访问控制、继承和多态性等概念,并通过示例代码来加深理解。掌握这些知识,您将能够编写出更加健壮、可维护性更高的 TypeScript 代码。