面试题答案
一键面试运用交叉类型优化项目类型架构的思路
- 合并相关类型:当多个模块存在部分相同的类型属性,但又有各自独特属性时,可使用交叉类型将这些相关类型合并。这样在涉及到处理不同模块间共有与特有属性的场景中,能清晰地定义统一类型,减少类型冗余。
- 增强接口扩展性:对于一些基础接口,随着项目的演进可能需要在不同模块中添加额外功能。通过交叉类型,可在不修改原始接口的情况下,为其添加新的属性和方法,符合开闭原则,提高代码的可维护性。
- 简化函数参数类型:在函数接受多种类型组合的参数时,交叉类型可以简洁地定义参数类型,使函数签名更清晰,调用者也能更明确参数要求。
架构设计思路
- 分析模块关系:梳理不同模块之间的数据交互和依赖关系,明确哪些类型需要进行合并或扩展。
- 定义基础类型:针对每个模块,定义其基础的类型接口,这些接口应包含该模块核心功能所涉及的数据结构。
- 使用交叉类型扩展:在需要跨模块交互的地方,利用交叉类型将相关的基础类型进行组合,形成新的、满足交互需求的类型。
关键代码示例
假设我们有两个模块,一个是用户模块,一个是订单模块。
// 用户模块基础类型
interface User {
id: number;
name: string;
}
// 订单模块基础类型
interface Order {
orderId: string;
amount: number;
}
// 处理用户订单相关功能时,需要结合用户和订单信息
type UserOrder = User & Order;
// 定义一个函数,处理用户订单
function processUserOrder(userOrder: UserOrder) {
console.log(`Processing order ${userOrder.orderId} for user ${userOrder.name}`);
}
// 创建一个UserOrder实例
const myOrder: UserOrder = {
id: 1,
name: 'John Doe',
orderId: '12345',
amount: 100
};
processUserOrder(myOrder);
在上述示例中,User
和Order
分别是用户模块和订单模块的基础类型。通过交叉类型User & Order
创建了UserOrder
类型,该类型既包含用户信息又包含订单信息。在processUserOrder
函数中,清晰地定义了参数类型为UserOrder
,使函数的功能和参数要求一目了然。这样在大型项目中,处理复杂的模块间类型交互时,交叉类型能够有效地优化类型架构,提高代码的可维护性和扩展性。