使用 typescript 在 Redux thunk 中返回一个 Promise

Posted

技术标签:

【中文标题】使用 typescript 在 Redux thunk 中返回一个 Promise【英文标题】:Returning a promise in a Redux thunk with typescript 【发布时间】:2019-01-24 16:56:27 【问题描述】:

我收到此打字稿错误:Property 'then' does not exist on type 'ThunkAction<Promise<boolean>, IinitialState, undefined, any>'.

请帮忙!

我如何配置我的商店并包含类型:

    return createStore(
      rootReducer,
      intialState,
      require('redux-devtools-extension').composeWithDevTools(
        applyMiddleware(
          thunk as ThunkMiddleware<IinitialState, any>,
          require('redux-immutable-state-invariant').default()
        )
      )

动作创建者:

type ThunkResult<R> = ThunkAction<R, IinitialState, undefined, any>;

export function anotherThunkAction(): ThunkResult<Promise<boolean>> 
  return (dispatch, getState) => 
    return Promise.resolve(true);
  

然后在我的组件中我有一个道具接口:

interface IProps 
  anotherThunkAction: typeof anotherThunkAction;

然后:

  componentWillMount() 
    this.props.anotherThunkAction().then(() => console.log('hello world'))
  

连接我正在使用 react-i18next 的地方:

export default translate('manageInventory')(
  connect(
    mapStateToProps,
    
      anotherThunkAction
    
  )(ManageInventory)
);

【问题讨论】:

【参考方案1】:

感谢这篇文章,当您必须在 reducer 之间共享切片时,执行 thunk 和 createSlice 有点棘手

【讨论】:

【参考方案2】:

我认为您没有正确地分派东西......您在调用您的操作时没有将其传递给商店。

如果您直接调用该操作,您将返回:

ThunkAction<Promise<boolean>, IinitialState, undefined, any>

正如 tsc 告诉你的那样,它没有 then 函数。当你通过dispatch 运行某些东西时,它会将ThunkResult&lt;R&gt; 变成R

您还没有向商店展示您如何connect 您的组件 - 但我认为这就是问题所在。这是一个示例:

type MyThunkDispatch = ThunkDispatch<IinitialState, undefined, any>

const mapDispatchToProps = (dispatch: MyThunkDispatch) => (
  anotherThunkAction: () => dispatch(anotherThunkAction())
)

connect(null, mapDispatchToProps)(MyComponent)

这会将anotherThunkAction 添加到props,您可以调用它,它会正确调用您的操作并返回承诺。

【讨论】:

感谢@tswaters,这帮助我意识到我需要提供更多细节。我更新了我的问题。哎呀,在接线时涉及到很多部分。如果我错了,请纠正我,但我相信由于我在 applyMiddleware 函数中添加类型,我不需要在我的所有 mapDispatchToProps 函数中添加类型。 @jfbloom22 你是对的。我也遇到了同样的事情,并试图找出最好的打字方式。老实说,我认为 redux-thunk 和 redux 可能没有正确的类型...除了mapDispatchToProps 函数之外,我可以输入所有内容 有办法解决这个问题吗? const mapDispatchToProps = (dispatch: ThunkDispatch) => ( dispatch: (arg: any) => dispatch(dispatch(arg)) ) this.props .dispatch(createClient(this.state.name)) .then(client = > this.props.history.push(/clients/$client.payload.id); )

以上是关于使用 typescript 在 Redux thunk 中返回一个 Promise的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Redux 4.0 TypeScript 绑定与 redux-thunk 一起使用

如何在 Typescript 中使用 redux-thunk 使用 ThunkAction 正确键入 thunk?

如何使用 redux-thunk 和 TypeScript 调度 ThunkAction

Redux 的 combineReducers 和 TypeScript

使用 TypeScript 在 Chrome 扩展背景页面中调度 Redux 操作

无法在 Typescript 中调度 redux 操作