首页 > 解决方案 > 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
(...)

难道我做错了什么?是否有可能让这个打字稿解决方案流畅运行?还是我应该使用不同的方法?如果是,那么您有什么建议?

标签: javascripttypescriptreduxflowtypetype-safety

解决方案


在 TypeScript 中,您不会使用case语句,而是使用if语句。

在 Redux 中没有规定必须使用 case 语句,实际上我们不再鼓励在 TypeScript 中使用这种模式,而是支持if带有类型保护的语句。

所以我想你可以试试。很抱歉,我在流程方面无法真正帮助您,我只能就我们如何为 TypeScript 推荐现代模式提供一般性建议,并希望这些能反映在流程中。

通常,您还可以查看官方的 Redux Toolkit,它带来了所有这些抽象。它只是部分流式,但这些类型可能已经满足您的需求,或者您甚至可以改进它们。


推荐阅读