我想等待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>;
答案 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
变体。