如何输入等待分派调度的结果?

时间:2019-03-17 09:06:10

标签: typescript redux react-redux redux-thunk

我想等待thunk的结果,thunk异步返回一个字符串。我的问题在最后一行–我不知道如何将cityName键入为string

  

//错误,类型为'ThunkAction,AppState,未定义,   不能将'any>'分配为'string'类型。

代码按预期工作,很不幸,我只需要将cityName键入为any

const getCity = (): Thunk<Promise<string>> => async (
  dispatch,
  getState
): Promise<string> => {
  // ...
  const city = await fetchCityApi(query);
  dispatch(setUserCity(city));
  return city;
};

export const getDataUsingCity = (): Thunk<void> => async dispatch => {
  const cityName: string = await dispatch(getCity());
};

我正在为Thunk使用一个包装器,只要我的Thunk不返回值,它就可以很好地工作:

export type Thunk<R> = ThunkAction<R, AppState, undefined, any>;

1 个答案:

答案 0 :(得分:1)

这似乎是redux-thunk中的一个已修复within this commit的错误。在提交中使用修改后的ThunkDispatch类型可以使上面的代码正常工作。但是,redux-thunk的新版本自2018年5月以来尚未发布,这意味着此修复程序尚未公开。

浏览相关问题,您也可以通过将Thunk<R>的定义更改为

来解决此问题。
export type Thunk<R> = ThunkAction<R, AppState, undefined, Action>;

这将强制使用正确的ThunkDispatch重载(需要使用ThunkAction的重载)。否则,由于any的TypeScript不能消除使用两者的歧义,因此只能选择第一个(采用普通Action的那个)。这也是上述PR解决此问题的原因,因为它们重新排列了两个重载以使TS默认选择ThunkAction变体。