在 TypeScript 中,type
(类型别名)和 interface
(接口)都用于定义类型,但它们在设计目的和使用场景上有一些关键区别。以下是它们的对比分析:
1. 定义范围
-
interface
主要用于定义对象类型的结构(如对象、函数、类等),强调描述数据的形状。
typescriptinterface User { id: number; name: string; }
-
type
可以定义任何类型(基本类型、联合类型、交叉类型、元组等),更灵活。
typescripttype ID = string | number; // 联合类型 type Point = [number, number]; // 元组 type User = { id: number; name: string }; // 对象类型
2. 扩展性
-
interface
支持通过
extends
继承扩展:typescriptinterface Animal { name: string } interface Dog extends Animal { breed: string }
-
type
通过交叉类型(
&
)实现类似扩展:typescripttype Animal = { name: string }; type Dog = Animal & { breed: string };
3. 合并声明
-
interface
多次声明同名接口时,会自动合并所有属性:
typescriptinterface User { id: number } interface User { name: string } // 最终 User = { id: number; name: string }
-
type
重复声明同名类型别名会报错:
typescripttype User = { id: number }; type User = { name: string }; // Error: 重复标识符
4. 高级类型操作
-
type
支持复杂类型操作(联合、条件、映射类型等):
typescripttype StringOrNumber = string | number; type Result<T> = { success: true; value: T } | { success: false; error: string };
-
interface
无法直接实现上述高级类型操作。
5. 类的实现
-
interface
类可以通过
implements
实现接口:typescriptinterface Printable { print(): void } class Document implements Printable { print() { /* ... */ } }
-
type
无法直接用于类的实现(除非是对象类型别名)。
6. 类型推断
-
interface
在声明合并和类型推断时更直观,适合大型项目中的协作。
-
type
在复杂类型操作中更明确,适合需要类型计算的场景。
何时使用?
-
优先用
interface
:定义对象类型、需要扩展或合并声明时(符合开放-封闭原则)。
-
优先用
type
:需要联合类型、条件类型等高级操作,或定义非对象类型(如函数、元组)。
总结
特性 | interface |
type |
---|---|---|
定义范围 | 对象类型 | 任意类型 |
扩展性 | extends |
交叉类型 & |
合并声明 | 支持 | 不支持 |
高级类型操作 | 不支持 | 支持 |
类的实现 | 支持 | 不支持 |
根据场景选择工具,两者也可混合使用(例如 type
引用 interface
)。