【发布时间】:2022-01-22 16:23:12
【问题描述】:
我有一个 reducer,它根据 action.type 执行不同的操作,某些操作的操作负载不同。
export enum ActionType {
UpdateEntireState = "UPDATE_ENTIRE_STATE",
UpdateStateItem = "UPDATE_STATE_ITEM"
}
type TypeEditData = {
id: string;
name: string;
surname: string;
age: number;
};
export type State = TypeEditData[];
export type Action = UpdateEntireState | UpdateStateItem;
type UpdateEntireState = {
type: ActionType.UpdateEntireState;
payload: State;
};
type UpdateStateItem = {
type: ActionType.UpdateStateItem;
payload: { id: string; data: TypeEditData };
};
export function reducer(state: State, action: Action): State {
const { type, payload } = action;
switch (type) {
case ActionType.UpdateEntireState: {
return [...payload];
}
case ActionType.UpdateStateItem: {
const person = state.filter((item) => item.id === payload.id);
return [...state, person[0]];
}
default: {
throw Error("Wrong type of action!");
}
}
}
此代码不起作用,错误会说我的操作负载可以是State 或{ id: string; data: TypeEditData }。
但是,如果我使用像这样的点符号访问 switch case 内的有效负载属性
return [...action.payload];
不会有任何错误,并且类型保护可以正常工作。
const { type, payload } = action; 与 action.type 和 action.payload 在类型方面有何不同?为什么 typeguard 不能使用扩展语法?
TS 版本 - 4.3.4
【问题讨论】:
-
@PrathapParameswar 感谢您的评论,但恐怕这个答案只是让有效载荷是任何类型的。
标签: javascript typescript reduce typeguards