首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在typescript中使用redux-actions、redux-thunk和redux-promise中间件

在typescript中使用redux-actions、redux-thunk和redux-promise中间件
EN

Stack Overflow用户
提问于 2017-10-18 17:25:00
回答 2查看 1.4K关注 0票数 3

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

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

以下是身份验证的示例:

代码语言:javascript
复制
/* actions */
const login = createAction(LOGIN, authService.login);


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

由于我使用的是redux-promise-中间件,因此会自动分派LOGIN_PENDINGLOGIN_FULFILLED/LOGIN_REJECTED操作。我如何为这些类型创建类型,以便reducer可以确定它正在处理的是什么操作对象?

因为redux-actions遵循FSA,所以_FULFILLED应该有action.payload_REJECTED应具有action.error

代码语言:javascript
复制
/* 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类型。

EN

回答 2

Stack Overflow用户

发布于 2017-10-18 19:14:29

要做到这一点,“正常”的方法是指定所有“操作接口”和一个向下延伸到reducer的联合类型。然后打开类型。但从示例代码看,不清楚AuthAction类型是否为联合类型……

例如:

代码语言:javascript
复制
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

减速机:

代码语言:javascript
复制
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
  }
}

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

票数 0
EN

Stack Overflow用户

发布于 2019-12-20 23:00:41

我建议使用createAsyncAction而不是createAction。这样,您就可以按如下方式定义类型:

代码语言:javascript
复制
/* actions */
const login = createAsyncAction<
  typeof LOGIN,
  LoginResponse, // no need to wrap in Promise<>
  null, // this is optional Meta,
  [LoginPayload] // action creator arguments wrapped in array
>(LOGIN, authService.login);

但我恐怕不知道什么时候login是个垃圾:

代码语言:javascript
复制
/* actions */
const loginAction = createAsyncAction(LOGIN, authService.login)
const loginActionCreator = (data: LoginPayload) => async(dispatch: Dispatch) => {
  await dispatch(loginAction(data));
}
// ERROR: () => void is not assignable to () => (dispatch) => void (pseudo code)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46806840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档