MST

星途 面试题库

面试题:TypeScript状态管理库类型架构设计之复杂场景下的类型推导与优化

假设我们正在构建一个复杂的TypeScript状态管理库,其中涉及到多个状态切片,每个切片都有自己的状态类型和操作函数。例如,有用户信息切片、购物车切片等。要求设计一个类型系统,能够根据不同切片的操作函数,自动推导和维护状态的类型一致性。比如,当购物车切片中有一个添加商品的操作函数时,状态类型能够自动更新以反映购物车中商品数量的变化。请详细阐述你的设计思路,并给出关键部分的TypeScript代码示例。
29.9万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义状态切片类型:为每个状态切片定义独立的类型。例如,用户信息切片可能包含用户名、邮箱等信息,购物车切片可能包含商品列表及其数量等。
  2. 操作函数类型定义:为每个切片的操作函数定义类型,操作函数的类型参数应基于当前切片的状态类型,返回值类型为更新后的状态类型。
  3. 使用类型映射和泛型:通过类型映射和泛型,将操作函数与对应的状态切片类型关联起来,从而实现状态类型的自动推导和更新。

关键部分TypeScript代码示例

// 用户信息切片状态类型
type UserInfoState = {
  username: string;
  email: string;
};

// 购物车切片状态类型
type CartState = {
  items: { product: string; quantity: number }[];
};

// 定义操作函数类型
type Action<TState, TPayload> = (state: TState, payload: TPayload) => TState;

// 用户信息切片操作函数
const updateUserEmail: Action<UserInfoState, string> = (state, newEmail) => ({
 ...state,
  email: newEmail
});

// 购物车切片操作函数
const addToCart: Action<CartState, { product: string; quantity: number }> = (state, item) => {
  const existingIndex = state.items.findIndex(i => i.product === item.product);
  if (existingIndex!== -1) {
    const newItems = [...state.items];
    newItems[existingIndex].quantity += item.quantity;
    return { ...state, items: newItems };
  } else {
    return { ...state, items: [...state.items, item] };
  }
};

// 类型映射,将切片名称与状态类型和操作函数类型关联
type StateSlices = {
  userInfo: UserInfoState;
  cart: CartState;
};

type SliceActions = {
  userInfo: {
    updateEmail: Action<StateSlices['userInfo'], string>;
  };
  cart: {
    addItem: Action<StateSlices['cart'], { product: string; quantity: number }>;
  };
};

通过上述设计,当在购物车切片中添加商品操作函数时,CartState 类型会通过操作函数的逻辑自动更新状态类型,以反映购物车中商品数量的变化。同理,其他切片的操作函数也能维护各自状态类型的一致性。