使用Redux Toolkit+TypeScript时,无载荷动作该用什么类型?
答:
PayloadAction<void> 完全是正确的解决方案! 没错,对于当前无载荷但未来可能需要扩展载荷的Redux Toolkit动作,PayloadAction<void>就是最贴合你需求的类型选择。
为什么它合适?
Redux Toolkit的PayloadAction泛型专门支持传入void类型,用来明确标记该动作当前没有有效载荷。这种写法有两个核心优势:
- 保持了和有载荷动作一致的类型结构,未来扩展时成本极低——只需要把
void替换成你需要的载荷类型(比如PayloadAction<{value: number}>),不需要修改类型定义的整体结构。 - 自动生成的动作创建函数会适配这个类型:调用时不需要传参数(
SOME_ACTION()),完全符合无载荷动作的使用习惯。
修正后的代码示例
import { createSlice, PayloadAction } from "@reduxjs/toolkit"; // 用PayloadAction<void>标记无载荷动作 type SOME_ACTION = PayloadAction<void>; const SOME_SLICE = createSlice({ name: "SOME_SLICE", initialState: getInitialState(), reducers: { SOME_ACTION(state, action: SOME_ACTION) { // 当前无需使用payload,未来需要时直接修改泛型即可 state.loading = true; } } });
对比其他可选方案
如果你直接使用Action类型(从@reduxjs/toolkit导入的基础动作类型),虽然也能表示无载荷动作,但它的结构和PayloadAction不一致——Action仅包含type字段,而PayloadAction<void>会保留payload字段(类型为undefined)。当未来需要添加载荷时,你需要把类型从Action改成PayloadAction<NewType>,反而增加了代码调整的成本。
所以PayloadAction<void>是兼顾当前需求和未来扩展性的最优选择。
内容的提问来源于stack exchange,提问作者cbdeveloper
相关产品推荐
相关产品推荐

