使用接口继承定义对象类型
// 基本用户信息接口
interface BaseUserInfo {
name: string;
age: number;
}
// 权限相关信息接口
interface PermissionInfo {
role: string;
permissions: string[];
}
// 不同角色的专属信息接口示例
interface AdminExtraInfo {
adminLevel: number;
}
interface UserExtraInfo {
favoriteColor: string;
}
// 通过接口继承定义具体用户类型
interface AdminUser extends BaseUserInfo, PermissionInfo, AdminExtraInfo {}
interface NormalUser extends BaseUserInfo, PermissionInfo, UserExtraInfo {}
使用交叉类型定义对象类型
// 基本用户信息类型
type BaseUserInfo = {
name: string;
age: number;
};
// 权限相关信息类型
type PermissionInfo = {
role: string;
permissions: string[];
};
// 不同角色的专属信息类型示例
type AdminExtraInfo = {
adminLevel: number;
};
type UserExtraInfo = {
favoriteColor: string;
};
// 通过交叉类型定义具体用户类型
type AdminUser = BaseUserInfo & PermissionInfo & AdminExtraInfo;
type NormalUser = BaseUserInfo & PermissionInfo & UserExtraInfo;
优缺点对比
- 接口继承
- 优点:
- 更清晰的层次结构,适合大型项目中类型的组织和管理,不同的接口可以独立复用。例如
BaseUserInfo
和PermissionInfo
接口可以在其他地方被复用。
- 代码可读性好,通过继承关系能够直观地看出类型之间的关系。例如
AdminUser
继承自多个接口,能清晰知道它具备哪些属性。
- 缺点:
- 不够灵活,一旦定义了接口继承关系,扩展或修改其中某个接口可能会影响到所有继承它的接口。例如修改
BaseUserInfo
,所有继承它的用户类型都会受到影响。
- 交叉类型
- 优点:
- 非常灵活,能够自由组合不同的类型,在小型项目或者快速迭代的项目中使用起来更方便。例如可以随时通过交叉新的类型来扩展用户类型。
- 对现有类型的侵入性小,因为是通过
&
操作符组合,修改某个基础类型不会像接口继承那样直接影响到其他组合类型。
- 缺点:
- 缺乏明确的层次结构,对于大型项目来说,类型关系可能会变得复杂难以维护。例如多个交叉类型可能会有重复的基础类型,难以梳理其中的关系。
- 可读性在复杂组合时会下降,尤其是多个类型交叉在一起,不容易快速理解整个类型的结构。