MST

星途 面试题库

面试题:TypeScript接口的继承与交叉类型在复杂对象类型定义中的应用

假设你要定义一个复杂的用户信息对象类型,该对象既要包含基本用户信息(如姓名、年龄),又要具备权限相关信息(如角色、权限列表),并且不同角色可能有额外的专属信息。请使用接口继承和交叉类型两种方式来定义这个对象类型,并解释两种方式的优缺点。
44.2万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

使用接口继承定义对象类型

// 基本用户信息接口
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;

优缺点对比

  1. 接口继承
    • 优点
      • 更清晰的层次结构,适合大型项目中类型的组织和管理,不同的接口可以独立复用。例如BaseUserInfoPermissionInfo接口可以在其他地方被复用。
      • 代码可读性好,通过继承关系能够直观地看出类型之间的关系。例如AdminUser继承自多个接口,能清晰知道它具备哪些属性。
    • 缺点
      • 不够灵活,一旦定义了接口继承关系,扩展或修改其中某个接口可能会影响到所有继承它的接口。例如修改BaseUserInfo,所有继承它的用户类型都会受到影响。
  2. 交叉类型
    • 优点
      • 非常灵活,能够自由组合不同的类型,在小型项目或者快速迭代的项目中使用起来更方便。例如可以随时通过交叉新的类型来扩展用户类型。
      • 对现有类型的侵入性小,因为是通过&操作符组合,修改某个基础类型不会像接口继承那样直接影响到其他组合类型。
    • 缺点
      • 缺乏明确的层次结构,对于大型项目来说,类型关系可能会变得复杂难以维护。例如多个交叉类型可能会有重复的基础类型,难以梳理其中的关系。
      • 可读性在复杂组合时会下降,尤其是多个类型交叉在一起,不容易快速理解整个类型的结构。