插件窝 干货文章 TypeScript接口与Class的区别:何时该用Interface而非Class定义类型?

TypeScript接口与Class的区别:何时该用Interface而非Class定义类型?

接口 定义 需要 对象 667    来源:    2025-03-20

在TypeScript中,接口(Interface)和类(Class)都可以用来定义类型,但它们的使用场景和目的有所不同。理解它们的区别有助于你在合适的场景中选择合适的工具。

1. 接口(Interface)

接口主要用于定义对象的形状(Shape),即对象应该有哪些属性和方法。接口是纯粹的抽象结构,不包含具体的实现。

使用场景:

  • 定义对象的形状:当你需要定义一个对象的结构时,可以使用接口。例如,定义一个用户对象的结构。
  • 契约式编程:接口可以用来定义类或对象必须遵循的契约。例如,定义一个服务接口,要求所有实现该接口的类都必须提供某些方法。
  • 扩展和组合:接口可以通过继承(extends)来扩展其他接口,也可以通过交叉类型(&)来组合多个接口。

示例:

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

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

2. 类(Class)

类不仅定义了对象的形状,还包含了具体的实现。类可以包含属性、方法、构造函数等,并且可以被实例化。

使用场景:

  • 需要实例化对象:当你需要创建多个具有相同结构和行为的对象时,可以使用类。
  • 需要封装逻辑:类可以封装属性和方法,并且可以包含私有成员、受保护成员等访问控制。
  • 需要继承和多态:类支持继承,可以通过继承来复用代码,并且可以通过多态来实现不同的行为。

示例:

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@example.com');
user.print();

3. 何时使用接口而非类?

  • 不需要实例化:如果你只是需要定义一个对象的形状,而不需要创建具体的实例,那么使用接口更为合适。
  • 不需要实现:如果你只是定义契约,而不需要提供具体的实现,那么使用接口。
  • 需要灵活性:接口可以更容易地组合和扩展,适合在需要灵活定义类型结构的场景中使用。

4. 总结

  • 接口:用于定义对象的形状和契约,适合在不需要具体实现的场景中使用。
  • :用于定义对象的形状和行为,适合在需要实例化、封装逻辑、继承和多态的场景中使用。

在实际开发中,接口和类经常结合使用。例如,你可以定义一个接口来描述一个类的公共API,然后让类实现这个接口。这样可以确保类遵循接口定义的契约,同时保留类的具体实现。