typescript - 在 typescript 中使用 redux-actions、redux-thunk 和 redux-promise-middleware

标签 typescript redux redux-thunk redux-promise-middleware redux-actions

这里是 typescript + redux 生态系统的新手。

在 TypeScript 中使用 redux-actions、redux-thunk 和 redux-promise-middleware 时,如何将类型信息正确封装到异步操作中?

身份验证示例:

/* actions */
const login = createAction(LOGIN, authService.login);


/* authService */
async function login(payload: LoginPayload): Promise<LoginResponse> {
 // ... authenticate here.
}

因为我使用的是 redux-promise-middleware,LOGIN_PENDINGLOGIN_FULFILLED/LOGIN_REJECTED 操作会自动发送。我如何为这些创建类型,以便 reducer 可以找出它正在处理的操作对象?

由于 redux-actions 遵循 FSA,_FULFILLED 应该有 action.payload_REJECTED 应该有 action.error

/* reducer */
function loginReducer(state: AppState, action: AuthAction) {
  switch (action.type) {
    case LOGIN_FULFILLED:
      // action.payload should be defined as LoginResponse object here.
      // action.error shouldnt be present.
    case LOGIN_REJECTED:
      // action.error should be defined
  }
}

我将如何创建 AuthAction 类型?我猜它应该是每个单独操作类型的联合类型(可以是它们自己的联合类型)。 redux-actions 还为此提供了 ActionBaseAction 类型。

最佳答案

“正常”的方法是指定所有的“操作接口(interface)”和一个联合类型到 reducer。然后打开类型。但是从示例代码中不清楚 AuthAction 类型是否是联合类型...

例如

type T = Object; //Your resolve data type
interface ILoginAction {type: "LOGIN", payload: {promise: Promise<T> }}
interface ILoginRejectedAction {type: "LOGIN_REJECTED", error: YourErrorType }
interface ILoginFulfilledAction {type: "LOGIN_FULFILLED", payload: {data: T }}

export type LoginActions = ILoginAction | ILoginRejectedAction | ILoginFulfilledAction

reducer :

import { LoginActions } from "./actions"; //Or where your actions are
function loginReducer(state: AppState, action: LoginActions) {
  switch (action.type) {
    case "LOGIN":
      // action.payload should be defined as LoginResponse object here.
      // action.error shouldnt be present.
    case "LOGIN_REJECTED":
      // action.error should be defined
  }
}

您可能可以使用一些泛型以更智能的方式创建此联合,但这是手动方法。

关于typescript - 在 typescript 中使用 redux-actions、redux-thunk 和 redux-promise-middleware,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46806840/

相关文章:

javascript - Redux-thunk 派发一个 Action 并等待重新渲染

typescript - typescript FunctionPropertyNames 如何工作?

reactjs - 如果没有mapDispatchToProps,连接如何工作

javascript - 如何过滤数组中的字符串?

javascript - 使用 redux + redux thunk 等待后台任务的惯用方式

reactjs - 函数中的调度参数有什么意义?

typescript - 将属性定义为字符串或在 Typescript 中返回字符串的函数

typescript - 在 TypeScript 中扩展参数化接口(interface)的通用接口(interface)

angular - getRootNav() 和 navCtrl() 方法之间的区别

reactjs - React 从 useEffect 中的 Redux 商店获取状态