返回

Typescript接口、类、extends、implements用法区别和介绍

前端

接口和类:TypeScript 中对象类型详解

在 TypeScript 中,接口和类都是用于对象类型的强大工具。它们虽然有着相似的目的,但存在着一些关键差异,了解这些差异对于编写清晰、可维护的代码至关重要。

接口

定义:

接口定义了对象应该具有的属性和方法,但没有提供其具体实现。它就像一个合同,指定了对象必须遵循的规则。接口可以被多个类实现,这意味着多个类可以具有相同属性和方法的集合。

用途:

  • 提高代码的可读性: 接口了对象应具备的特征,使代码更易于理解和维护。
  • 强制一致性: 通过接口,可以确保实现该接口的所有类都具有相同的基本属性和行为。
  • 促进代码重用: 多个类可以实现同一个接口,从而减少了代码重复和提高了代码重用性。

示例:

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

实现:

类可以通过 implements 实现接口。

class Employee implements 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.`);
  }
}

定义:

类是 TypeScript 中创建对象的蓝图。它包含属性和方法的声明,以及其具体实现。类可以继承自其他类,这允许子类继承父类的属性和方法,并提供自己的实现。

用途:

  • 创建对象: 类可用于创建具有特定属性和行为的对象。
  • 组织代码: 类可以将相关代码组织在一起,使代码更易于管理。
  • 促进代码重用: 通过继承,子类可以重用父类的代码,减少重复并提高代码重用性。

示例:

class Animal {
  name: string;
  age: number;

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

  eat() {
    console.log('The animal is eating.');
  }
}

继承和多态

继承:

继承允许子类从父类继承属性和方法。子类可以覆盖父类的方法,以提供自己的实现。

多态:

多态允许使用父类引用其子类对象,从而可以调用子类覆盖的方法。这允许在运行时根据具体类型执行不同的操作。

示例:

// 定义父类
class Shape {
  area() {
    console.log('Shape area');
  }
}

// 定义子类
class Rectangle extends Shape {
  width: number;
  height: number;

  constructor(width: number, height: number) {
    super();
    this.width = width;
    this.height = height;
  }

  area() {
    console.log(`Rectangle area: ${this.width * this.height}`);
  }
}

// 使用父类引用子类对象
const shape: Shape = new Rectangle(4, 5);
shape.area(); // 输出:Rectangle area: 20

关键差异

  • 接口只包含属性和方法的声明,而类包含其具体实现。
  • 接口可以被多个类实现,而一个类只能继承自一个父类。
  • 继承允许子类重用父类的代码,而接口促进代码重用通过强制实现相同的属性和方法集合。
  • 多态允许在运行时执行不同类型的操作,而接口强制一致性,确保所有实现其的类都具有相同的行为。

常见问题解答

  1. 接口和抽象类有什么区别?

    • 抽象类也可以定义方法,但其方法没有实现,必须由子类实现。因此,抽象类更接近于接口,但不能被多个类实现。
  2. 什么时候应该使用接口而不是类?

    • 当需要定义对象的一组公共属性和方法时,而不提供其实现时,应使用接口。
  3. 什么时候应该使用类而不是接口?

    • 当需要创建具有自己行为和状态的对象时,应使用类。
  4. 为什么接口不能包含构造函数?

    • 接口没有实例化,因此不需要构造函数。
  5. 为什么一个类只能继承自一个父类?

    • 允许多重继承会导致钻石问题,从而难以确定继承顺序。