TypeScript 中 class 的一些用法

TypeScript 是一种由微软开发的 JavaScript 超集,它给 JavaScript 带来了类型检查和更好的面向对象编程能力。在 TypeScript 中,class 是一种重要的语言特性,它能让我们更方便地使用面向对象的编程方式。本文将介绍 TypeScript 中 class 的一些用法,包括类的定义、继承、修饰符、抽象类和接口等。

类的定义

在 TypeScript 中,我们可以使用 class 关键字来定义一个类。类的定义包括类名、类的属性和方法。

class Animal {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
  sayHello() {
    console.log(`Hello, I'm ${this.name}.`);
  }
}

上面的代码定义了一个 Animal 类,它有一个 name 属性和一个 sayHello 方法。在构造函数中,我们通过 this 关键字来初始化 name 属性。在 sayHello 方法中,我们使用模板字符串来输出一句问候语。注意,类的方法可以直接访问类的属性。

继承

在 TypeScript 中,我们可以使用 extends 关键字来实现类的继承。子类继承了父类的属性和方法,并可以在此基础上添加自己的属性和方法。

class Cat extends Animal {
  constructor(name: string) {
    super(name);
  }
  meow() {
    console.log(`${this.name} meows.`);
  }
}

上面的代码定义了一个 Cat 类,它继承了 Animal 类。在 Cat 类的构造函数中,我们调用了父类的构造函数,并传入了 name 参数。在 meow 方法中,我们输出了一句猫叫声。注意,子类的构造函数必须调用父类的构造函数,否则会出现编译错误。

修饰符

在 TypeScript 中,我们可以使用修饰符来控制类的属性和方法的访问权限。常用的修饰符包括 public、private 和 protected。

  • public:默认修饰符,表示属性和方法可以在类的内部和外部访问。
  • private:表示属性和方法只能在类的内部访问。
  • protected:表示属性和方法可以在类的内部和子类中访问。
class Person {
  public name: string;
  private age: number;
  protected gender: string;
  constructor(name: string, age: number, gender: string) {
    this.name = name;
    this.age = age;
    this.gender = gender;
  }
  sayHello() {
    console.log(`Hello, I'm ${this.name}.`);
  }
  private sayAge() {
    console.log(`I'm ${this.age} years old.`);
  }
  protected sayGender() {
    console.log(`My gender is ${this.gender}.`);
  }
}

class Student extends Person {
  constructor(name: string, age: number, gender: string) {
    super(name, age, gender);
  }
  introduce() {
    console.log(`My name is ${this.name}.`);
    this.sayAge();
    this.sayGender();
  }
}

上面的代码定义了一个 Person 类和一个 Student 类,其中 Person 类有一个 public 的 name 属性、一个 private 的 age 属性和一个 protected 的 gender 属性。Person 类有一个 public 的 sayHello 方法、一个 private 的 sayAge 方法和一个 protected 的 sayGender 方法。Student 类继承了 Person 类,并在此基础上添加了一个 introduce 方法,该方法可以访问父类的 protected 属性和方法。

抽象类

在 TypeScript 中,我们可以使用 abstract 关键字定义抽象类。抽象类不能被实例化,只能被继承。抽象类可以包含抽象方法,抽象方法没有实现,必须在子类中被实现。

abstract class Shape {
  abstract getArea(): number;
}

class Circle extends Shape {
  radius: number;
  constructor(radius: number) {
    super();
    this.radius = radius;
  }
  getArea() {
    return Math.PI * this.radius * this.radius;
  }
}

class Rectangle extends Shape {
  width: number;
  height: number;
  constructor(width: number, height: number) {
    super();
    this.width = width;
    this.height = height;
  }
  getArea() {
    return this.width * this.height;
  }
}

上面的代码定义了一个 Shape 抽象类和两个实现类 Circle 和 Rectangle。Shape 类有一个抽象方法 getArea,该方法没有实现。Circle 类和 Rectangle 类继承了 Shape 类,并实现了 getArea 方法。

接口

在 TypeScript 中,我们可以使用接口来描述对象的形状。接口可以包含属性、方法、索引签名和函数签名等成员。

interface Person {
  name: string;
  age: number;
  sayHello(): void;
}

class Student implements Person {
  name: string;
  age: number;
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
  sayHello() {
    console.log(`Hello, I'm ${this.name}.`);
  }
}

上面的代码定义了一个 Person 接口和一个实现类 Student。Person 接口包含 name 属性、age 属性和 sayHello 方法。Student 类实现了 Person 接口,并提供了 name 属性、age 属性和 sayHello 方法的实现。

总结

本文介绍了 TypeScript 中 class 的一些用法,包括类的定义、继承、修饰符、抽象类和接口等。通过学习这些内容,我们可以更好地使用 TypeScript 进行面向对象编程。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/658eb191eb4cecbf2d48a9ea


纠错
反馈