interface 与 type 的基本区别
interface 是 TypeScript 专门用于定义对象类型结构的语法,强调“形状”描述。它支持合并声明(同名接口自动合并),且通常用于对象、类的类型定义。
type 是类型别名,可以定义任何类型(包括原始类型、联合类型、交叉类型等)。它不支持合并声明,但灵活性更高,适合复杂类型逻辑。
核心差异点
扩展方式
interface 使用 extends
继承:
interface A { x: number }
interface B extends A { y: string }
type 使用交叉类型 &
:
type A = { x: number }
type B = A & { y: string }
合并行为
interface 允许重复声明并自动合并:
interface User { name: string }
interface User { age: number }
// 最终 User 包含 name 和 age
type 重复声明会报错。
兼容性
interface 专为对象设计,提供更好的错误提示;type 能表达更广泛的类型,如:
type Primitive = string | number | boolean
设计两种方式的原因
-
历史原因
interface 早期用于描述对象形状,而 type 后来引入以支持更复杂的类型运算。 -
场景互补
- 需要扩展或合并时(如库类型定义)优先用 interface。
- 需要组合类型或定义非对象类型时(如联合类型、元组)必须用 type。
-
语义清晰性
interface 明确表示“对象契约”,type 更偏向“类型别名”,两者语义不同。
实际应用建议
-
优先用 interface
对象类型定义、类实现(implements
)或需要声明合并时。 -
选择 type 的情况
需要联合类型、映射类型或复杂类型运算时:type Partial<T> = { [P in keyof T]?: T[P] }
-
一致性
项目内保持统一,避免混用造成理解成本。