TypeScript 中的 interface 和 type 有什么区别?
1. 声明合并
- interface 支持声明合并:同名接口可以被多次声明,TypeScript 会自动合并它们的定义
- type 不支持重声明:重复定义同名类型别名会导致编译错误
- 声明合并使得 interface 成为扩展第三方库类型、增强全局类型(如 Window)的首选
2. 表达能力
- type 可以表示联合类型(A | B)、交叉类型(A & B)、元组类型、映射类型、条件类型等
- interface 只能描述对象形状,不能直接表示联合类型或映射类型
- 当需要定义非对象形状的类型时,必须使用 type
3. 扩展语法
- interface 使用 extends 关键字扩展:interface Dog extends Animal { ... }
- type 使用 & 交叉运算符组合:type Dog = Animal & { ... }
- extends 会在扩展时立即检查兼容性并报错;& 在遇到冲突属性时可能静默生成 never 类型
4. 错误信息质量
- interface 保留名称,编译器错误信息更简洁易读
- type 在错误信息中会展开为完整的结构描述,复杂类型可能显示冗长
5. 使用建议
- 定义对象形状、公共 API 契约、类实现契约时,优先使用 interface
- 需要联合类型、交叉类型、映射类型或条件类型时,使用 type
- 团队应统一约定并在 ESLint 中配置相应规则,保持一致性比具体选择更重要