Redux 工具包 - 如何在调用动作创建者时检查负载类型
Redux Toolkit - How to have the payload type checked, when calling an action creator
我使用 redux 工具包已有一段时间了,我喜欢它减少样板文件的方式。
我也想使用打字稿,但我无法对动作负载进行类型检查。
f.i。我有:
const increase: CaseReducer<AppState, PayloadAction<number>> = (
state,
action,
) => {
state.usedWeight += action.payload;
};
并在 createSlice 中使用它。
当我想发送那个动作时,我写
dispatch(increase(10));
但我也可以写
dispatch(increase("10"));
没有打字稿抱怨。
当我将鼠标悬停在 vs 代码中的导入增加时,它说:
const increase: ActionCreatorWithPayload<any, string> | ActionCreatorWithoutPayload<string>
为什么 ActionCreator 不知道这个 Action 期望哪个 Payload?
我也遇到了同样的问题
Redux Toolkit 为 action creator 提供类型保护:
您可以测试 increment.match(action)
是否为真。
然后类型检查在 if 语句内工作,但在 if 语句外不工作。
parseInt(action.payload, action.payload); // compiles without any error
if (increment.match(action)) {
parseInt(action.payload, action.payload); // here TypeScript produces an error
}
难道不应该在不取消此类类型保护的情况下确保类型检查吗?我非常感谢有人找到更好的解决方案。
问题是我没有直接在createSlice中使用CaseReducer,而是在
中累积了它们
const reducers: ValidateSliceCaseReducers<
AppState,
SliceCaseReducers<AppState>
> = {
### List of CaseReducers ###
}
我在这里使用的打字中断了稍后为动作创建者推断类型。
(我想我是从 redux 文档中获取并使用它们的,否则我将不得不将 AppState 作为状态类型分别添加到每个 reducer。)
我现在的解决方案是将 CaseReducers 直接放入 createSlice 调用中。
为了保持切片干净,我将把那些 CaseReducers 放在子文件中。
我使用 redux 工具包已有一段时间了,我喜欢它减少样板文件的方式。 我也想使用打字稿,但我无法对动作负载进行类型检查。
f.i。我有:
const increase: CaseReducer<AppState, PayloadAction<number>> = (
state,
action,
) => {
state.usedWeight += action.payload;
};
并在 createSlice 中使用它。 当我想发送那个动作时,我写
dispatch(increase(10));
但我也可以写
dispatch(increase("10"));
没有打字稿抱怨。
当我将鼠标悬停在 vs 代码中的导入增加时,它说:
const increase: ActionCreatorWithPayload<any, string> | ActionCreatorWithoutPayload<string>
为什么 ActionCreator 不知道这个 Action 期望哪个 Payload?
我也遇到了同样的问题
Redux Toolkit 为 action creator 提供类型保护:
您可以测试 increment.match(action)
是否为真。
然后类型检查在 if 语句内工作,但在 if 语句外不工作。
parseInt(action.payload, action.payload); // compiles without any error
if (increment.match(action)) {
parseInt(action.payload, action.payload); // here TypeScript produces an error
}
难道不应该在不取消此类类型保护的情况下确保类型检查吗?我非常感谢有人找到更好的解决方案。
问题是我没有直接在createSlice中使用CaseReducer,而是在
中累积了它们const reducers: ValidateSliceCaseReducers<
AppState,
SliceCaseReducers<AppState>
> = {
### List of CaseReducers ###
}
我在这里使用的打字中断了稍后为动作创建者推断类型。 (我想我是从 redux 文档中获取并使用它们的,否则我将不得不将 AppState 作为状态类型分别添加到每个 reducer。)
我现在的解决方案是将 CaseReducers 直接放入 createSlice 调用中。 为了保持切片干净,我将把那些 CaseReducers 放在子文件中。