type与interface的区别
在 TypeScript 中,type 和 interface 都用于定义类型,但它们在设计目的和使用场景上存在一些关键区别。以下是两者的主要对比:
1. 基本定义
interface
专门用于描述对象形状(Object Shape),包括属性、方法、索引签名等。typescriptinterface User { id: number; name: string; sayHello(): void; }type
是类型别名,可为任意类型命名(包括原始类型、联合类型、元组等)。typescripttype ID = number | string; // 联合类型 type Point = [number, number]; // 元组 type Callback = () => void; // 函数类型
2. 扩展性
interface
支持声明合并(Declaration Merging):同名的interface会自动合并。typescriptinterface Car { brand: string; } interface Car { model: string; } // 合并为 { brand: string; model: string; }type
不支持声明合并,重复定义会报错。typescripttype Car = { brand: string }; type Car = { model: string }; // ❌ 错误: 重复标识符
3. 继承方式
interface
使用extends继承:typescriptinterface Animal { name: string; } interface Dog extends Animal { breed: string; }type
使用交叉类型&实现类似继承:typescripttype Animal = { name: string }; type Dog = Animal & { breed: string };
4. 实现(implements)
class可实现interface或type
两者均可被类实现(只要类型兼容)。typescriptinterface IUser { name: string; } type TUser = { name: string }; class UserA implements IUser { name = "Alice"; } class UserB implements TUser { name = "Bob"; }
5. 兼容类型范围
interface
仅能描述对象类型(Object Types)。type
可描述任意类型:typescripttype A = string; // 原始类型 type B = "yes" | "no"; // 字面量联合类型 type C = ReturnType<() => number>; // 工具类型
6. 性能差异(极端场景)
interface
在复杂类型检查中(如深层嵌套)可能略微更快(但实际差异极小)。type
某些工具类型(如Union Types)可能导致递归检查变慢,但通常可忽略。
7. 错误提示友好度
- 使用
interface时,错误信息会直接显示接口名(如User),更易读。 - 使用
type时,复杂类型可能直接展开显示结构。
使用建议
| 场景 | 推荐 |
|---|---|
| 定义对象类型(如 API 响应) | interface(更符合设计初衷) |
| 需要声明合并(扩展第三方库) | interface |
| 联合类型、元组、函数类型等 | type |
复杂工具类型(如 Conditional Types) | type |
总结
| 特性 | interface | type |
|---|---|---|
| 对象类型 | ✅ 推荐 | ✅ |
| 非对象类型(联合、元组等) | ❌ | ✅ |
| 声明合并 | ✅ | ❌ |
类实现(implements) | ✅ | ✅ |
| 扩展性 | extends | &(交叉类型) |
| 错误提示友好度 | 优 | 中(复杂类型可能较差) |
优先选择 interface 描述对象结构,用 type 处理其他类型场景。 两者在大部分情况下可互换,团队可根据规范统一风格。