面试题答案
一键面试设计思路
- 定义状态切片类型:为每个状态切片定义独立的类型。例如,用户信息切片可能包含用户名、邮箱等信息,购物车切片可能包含商品列表及其数量等。
- 操作函数类型定义:为每个切片的操作函数定义类型,操作函数的类型参数应基于当前切片的状态类型,返回值类型为更新后的状态类型。
- 使用类型映射和泛型:通过类型映射和泛型,将操作函数与对应的状态切片类型关联起来,从而实现状态类型的自动推导和更新。
关键部分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
类型会通过操作函数的逻辑自动更新状态类型,以反映购物车中商品数量的变化。同理,其他切片的操作函数也能维护各自状态类型的一致性。