面试题答案
一键面试设计思路
- 可修改的部分用户信息类型:利用
Partial
映射类型将BaseUserInfo
中的所有属性变为可选,这样就得到了可修改的部分用户信息类型。因为部分属性可以不存在,所以适合用于需要对用户信息进行修改的模块,且修改时可以只更新部分属性。 - 只读的完整用户信息类型:使用
Readonly
映射类型将BaseUserInfo
所有属性变为只读,保证该类型的用户信息不能被修改,适用于只需要读取用户信息的模块。
具体类型定义代码
interface BaseUserInfo {
id: number;
name: string;
email: string;
}
// 可修改的部分用户信息类型
type MutablePartialUserInfo = Partial<BaseUserInfo>;
// 只读的完整用户信息类型
type ReadonlyFullUserInfo = Readonly<BaseUserInfo>;
优势
- 类型安全:在编译阶段就能发现类型不匹配的错误,避免在运行时出现意外的错误,提高了代码的稳定性和可靠性。例如,如果一个模块尝试修改
ReadonlyFullUserInfo
类型的用户信息,TypeScript 编译器会报错。 - 代码清晰:通过自定义工具类型,不同模块获取的用户信息类型一目了然,增强了代码的可读性。比如
MutablePartialUserInfo
一看就知道是可修改且部分的用户信息类型。 - 灵活性:可以根据不同模块的需求,灵活地组合
Partial
和Readonly
来生成所需的类型,满足各种业务场景。例如,如果某个模块需要只读的部分用户信息类型,也可以很容易通过组合得到Readonly<Partial<BaseUserInfo>>
。
可能遇到的挑战
- 类型复杂性增加:随着项目的发展,基础数据结构可能变得更加复杂,自定义工具类型的组合也会增多,导致类型定义变得冗长和难以理解。例如,如果
BaseUserInfo
嵌套了多层对象,组合出的类型会变得非常复杂。 - 升级维护成本:当
BaseUserInfo
发生变化时,所有依赖于它的自定义工具类型都需要检查和更新,可能会影响到多个模块。比如BaseUserInfo
新增了一个属性,那么MutablePartialUserInfo
和ReadonlyFullUserInfo
都可能需要相应调整。 - 学习成本:对于新加入项目的开发人员,需要花费时间学习和理解这些自定义工具类型,尤其是复杂的组合类型,增加了上手的难度。