javascript - Flow - 类型安全的动作
问题描述
我正在使用流程,我想让我的减速器更安全。我遇到了这个评论,它提出了一个我觉得很好并且适合我的代码库的解决方案: https ://github.com/reduxjs/redux/issues/992#issuecomment-191152574
我正在尝试使用%checks
关键字将其移植到流中,但它不起作用。
我的代码:
export type Action<T> = {
type: string,
payload: T,
};
interface ActionCreator<P> {
type: string;
(payload: P): Action<P>;
}
export function actionCreator<P>(type: string): ActionCreator<P> {
return Object.assign((payload: P) => ({ type, payload }), { type });
}
export function isActionOfType<P>(
action: Action<any>,
creator: ActionCreator<P>
): boolean %checks {
return action.type === creator.type;
}
每当我像这样在减速器功能中使用它时
(...)
case isActionOfType(action, getArticles):
// action.payload is still any
(...)
难道我做错了什么?是否有可能让这个打字稿解决方案流畅运行?还是我应该使用不同的方法?如果是,那么您有什么建议?
解决方案
在 TypeScript 中,您不会使用case
语句,而是使用if
语句。
在 Redux 中没有规定必须使用 case 语句,实际上我们不再鼓励在 TypeScript 中使用这种模式,而是支持if
带有类型保护的语句。
所以我想你可以试试。很抱歉,我在流程方面无法真正帮助您,我只能就我们如何为 TypeScript 推荐现代模式提供一般性建议,并希望这些能反映在流程中。
通常,您还可以查看官方的 Redux Toolkit,它带来了所有这些抽象。它只是部分流式,但这些类型可能已经满足您的需求,或者您甚至可以改进它们。
推荐阅读
- ibm-watson - 从 Watson Assistant 工作区删除日志的客户 ID 是什么?
- android - 如何修复 webview_flutter 中的白屏?
- javascript - 如何使用 React 在发布请求期间创建加载栏
- windows - 如何修复任务计划程序错误 0x00041303 或 0x41303?
- c++ - 我可以缩短这个 if 语句吗?
- ios - 在 iPhone X 中叠加时,UIView 的顶部位置不佳
- perl - 如何使用 Perl File::RsyncP 按扩展名过滤文件
- android - 如何使回收站视图滚动超过项目的高度
- python - 使用 groupby 和 filter 功能比较使用多个条件的两个数据帧
- javascript - Math.round(Math.random()) 组合似乎在我的 javascript 程序中生成了太多的 0