文章

TypeScript 中的 `interface` 与 `class` 区别与使用场景对比

TypeScript 中的 `interface` 与 `class` 区别与使用场景对比

TypeScript 中的 interfaceclass 区别与使用场景对比

✅ interface 是什么?

  • 只负责描述数据结构(字段、类型、方法签名)
  • 没有实际实现逻辑
  • 编译后不会出现在 JS 中(开发时用,运行时无踪影
  • 通常用于 API、表单、对象的类型定义
1
2
3
4
5
6
7
8
9
10
11
interface Beer {
  name: string;
  style: string;
  rating: number;
}

const myBeer: Beer = {
  name: 'Heady Topper',
  style: 'NEIPA',
  rating: 5,
};

✅ class 是什么?

  • 可以描述结构(字段),也可以实现方法逻辑
  • 可以通过 new 来创建对象
  • 编译后会变成 JavaScript 的构造函数
  • 通常用于服务类、逻辑类、可实例化对象
1
2
3
4
5
6
7
8
9
10
11
class BeerService {
  private beers: Beer[] = [];

  addBeer(beer: Beer) {
    this.beers.push(beer);
  }

  getAllBeers(): Beer[] {
    return this.beers;
  }
}

🆚 interface vs class 对比表格

对比项interfaceclass
能否实例化(new)❌ 不可以✅ 可以
是否有实际实现逻辑❌ 没有✅ 有
编译后是否存在于 JS 中❌ 不存在✅ 存在
是否能做类型注解✅ 可以✅ 可以
是否适合做依赖注入(Angular)❌ 不可以✅ 可以
是否可以被继承✅ 支持 extends✅ 支持 extends / implements
推荐用途定义结构类型,如数据对象、API 返回值实现服务类、工具类、状态管理、组件类等

📝 使用建议

  • 如果只是定义对象结构 👉 用 interface
  • 如果要封装逻辑、状态、行为 👉 用 class
  • 如果你需要依赖注入 / Angular 服务 👉 必须用 class

📌 示例:配合使用

1
2
3
4
5
6
7
8
9
10
11
12
13
interface Beer {
  name: string;
  style: string;
  rating: number;
}

class BeerService {
  constructor(private data: Beer[]) {}

  filterByStyle(style: string): Beer[] {
    return this.data.filter(beer => beer.style === style);
  }
}
本文由作者按照 CC BY 4.0 进行授权