插件窝 干货文章 TypeScript 类型定义:接口和类该如何选择?

TypeScript 类型定义:接口和类该如何选择?

接口 定义 使用 email 511    来源:    2025-03-21

在 TypeScript 中,接口(interface)和类(class)都可以用来定义类型,但它们的使用场景和目的有所不同。选择使用接口还是类,取决于你的具体需求。以下是一些指导原则,帮助你决定何时使用接口,何时使用类。

1. 接口(interface

接口主要用于定义对象的形状(shape),即对象应该有哪些属性和方法。接口是纯类型定义,不会生成任何 JavaScript 代码。

使用场景:

  • 定义对象的结构:当你需要定义一个对象的形状时,接口是一个很好的选择。例如,定义一个用户对象的结构。
  • 契约式编程:接口可以用来定义类或对象必须遵循的契约。多个类可以实现同一个接口,确保它们都遵循相同的结构。
  • 扩展性:接口可以通过继承来扩展,允许你创建更复杂的类型定义。
  • 类型检查:接口主要用于类型检查,不会生成任何实际的代码。

示例:

interface User {
  id: number;
  name: string;
  email: string;
}

function printUser(user: User) {
  console.log(`User: ${user.name}, Email: ${user.email}`);
}

2. 类(class

类不仅定义了对象的形状,还提供了实现。类可以包含属性和方法的实现,并且可以被实例化。

使用场景:

  • 需要实例化对象:当你需要创建多个具有相同结构和行为的对象时,类是一个很好的选择。
  • 封装逻辑:类可以封装属性和方法,并且可以包含构造函数、getter/setter、静态方法等。
  • 继承:类支持继承,允许你创建一个基类,然后通过继承来扩展或修改其行为。
  • 访问修饰符:类支持 publicprivateprotected 等访问修饰符,可以控制属性和方法的访问权限。

示例:

class User {
  id: number;
  name: string;
  email: string;

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

  print() {
    console.log(`User: ${this.name}, Email: ${this.email}`);
  }
}

const user = new User(1, "John Doe", "john.doe@example.com");
user.print();

3. 接口与类的结合使用

在实际开发中,接口和类经常结合使用。你可以使用接口来定义类的结构,然后让类实现这个接口。

示例:

interface IUser {
  id: number;
  name: string;
  email: string;
  print(): void;
}

class User implements IUser {
  id: number;
  name: string;
  email: string;

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

  print() {
    console.log(`User: ${this.name}, Email: ${this.email}`);
  }
}

const user = new User(1, "John Doe", "john.doe@example.com");
user.print();

总结

  • 使用接口:当你只需要定义对象的形状或契约时,使用接口。接口是纯类型定义,不会生成任何代码。
  • 使用类:当你需要创建实例对象、封装逻辑、或使用继承时,使用类。类不仅定义了类型,还提供了实现。
  • 结合使用:在实际开发中,接口和类可以结合使用,接口定义结构,类实现接口并提供具体实现。

根据你的具体需求,选择合适的工具来定义类型。