12. 接口 vs Type
约 460 字大约 2 分钟
2025-06-02
特性 | 接口(interface) | 类型别名(type) |
---|---|---|
基本语法 | interface Person { name: string } | type Person = { name: string } |
扩展方式 | 使用 extends 继承 | 使用 & 交叉类型 |
声明合并 | ✅ 支持,同名的接口会自动合并 | ❌ 不支持,同名会报错 |
适用类型 | 主要用于对象类型 | 可用于对象、原始类型、联合类型等 |
实现(implements) | ✅ 可以被类实现 | ✅ 可以被类实现 |
性能 | 类型检查时性能略优 | 复杂类型可能稍慢 |
映射类型 | ❌ 不支持 | ✅ 支持 |
联合类型 | ❌ 不支持 | ✅ 支持 |
元组类型 | ❌ 不支持 | ✅ 支持 |
计算属性 | ❌ 不支持 | ✅ 支持 |
递归定义 | ✅ 有限支持 | ✅ 更好支持 |
使用场景建议
优先使用 interface 的情况:
- 定义对象形状(尤其是公共 API)
- 需要声明合并(如扩展第三方库类型)
- 需要被类实现时
- 简单的对象类型定义
优先使用 type 的情况:
- 需要定义联合类型、元组类型
- 需要使用映射类型、条件类型等高级特性
- 需要简写复杂类型或创建工具类型
- 需要定义非对象类型(如原始类型别名)
示例代码对比
扩展示例
// 接口扩展
interface Animal {
name: string;
}
interface Bear extends Animal {
honey: boolean;
}
// 类型别名扩展
type Animal = {
name: string;
};
type Bear = Animal & {
honey: boolean;
};
联合类型示例(仅 type 支持)
type Result = Success | Failure;
type Shape = Circle | Square | Triangle;
声明合并示例(仅 interface 支持)
interface User {
name: string;
}
interface User {
age: number;
}
// 最终 User 同时有 name 和 age
在实际开发中,两者可以混合使用,根据具体需求选择最合适的工具。许多项目会以接口为主,在需要高级类型特性时使用类型别名。
更新日志
2025/8/24 08:17
查看所有更新日志
e7112
-1于