【TypeScript】TypeScript中 interface 和 type 的区别
在 TypeScript 中,interface 和 type 都用于定义类型,但它们在设计目的和特性上有一些关键区别:
1. 核心区别
interface
专门用于定义对象类型(包括函数、类、索引签名等)。强调“形状”(shape)描述,适合面向对象场景。type
是类型别名(Type Alias),可为任意类型命名(包括对象、联合类型、元组、原始值等)。功能更通用。
2. 关键差异
| 特性 | interface |
type |
|---|---|---|
| 声明合并 | ✅ 支持(同名的 interface 自动合并) |
❌ 不支持(同名会报错) |
| 扩展方式 | 用 extends 继承 |
用 & 交叉类型 |
| 实现(implements) | 类可直接实现 interface |
类可实现 type(但需是对象类型) |
| 联合类型/元组等 | ❌ 无法直接定义 | ✅ 可直接定义(如 type A = B | C) |
| 映射类型/复杂运算 | ❌ 不支持 | ✅ 支持(如 keyof、条件类型等) |
| 函数类型 | 可通过调用签名定义 | 可直接用箭头函数语法(如 () => void) |
3. 语法示例
扩展(Extend)
// interface 继承
interface Animal {
name: string;
}
interface Dog extends Animal {
bark(): void;
}
// type 交叉类型
type Animal = { name: string };
type Dog = Animal & { bark(): void };
联合类型(Union)
// type 支持联合类型
type ID = string | number;
// interface 无法直接定义联合类型
声明合并
// interface 自动合并
interface User { name: string; }
interface User { age: number; }
const user: User = { name: "Alice", age: 30 }; // ✅ 合并生效
// type 会报错
type User = { name: string };
type User = { age: number }; // ❌ Error: Duplicate identifier 'User'
复杂类型运算
// type 支持条件类型、映射类型等
type Keys = "name" | "age";
type User = {
[K in Keys]: string; // 映射类型
};
// interface 无法实现此类操作
4. 使用建议
- 优先用
interface的场景:- 定义对象类型(尤其是需要声明合并时)。
- 类实现(
implements)或库的类型扩展(如为第三方库添加新属性)。
- 优先用
type的场景:- 需要定义联合类型、元组、函数类型等非对象类型。
- 需要复杂类型操作(如条件类型、映射类型)。
- 一次性使用的类型别名。
总结
| 维度 | interface |
type |
|---|---|---|
| 设计目的 | 描述对象形状(OOP 友好) | 为任意类型创建别名(灵活通用) |
| 灵活性 | 较低(专注对象结构) | 较高(支持所有类型和运算) |
| 扩展性 | ✅ 声明合并、extends 继承 |
✅ 交叉类型(&) |
| 适用场景 | 公共 API、类实现、第三方类型扩展 | 联合类型、复杂类型运算、临时类型 |
实践中:两者在对象类型定义上功能高度重叠,可根据团队规范选择。大型项目建议多用
interface(更清晰易扩展),复杂类型逻辑用type补充。

浙公网安备 33010602011771号