Я использую redux-thunk
, чтобы использовать asyn c создателей действий. Результат также возвращается соответствующему абоненту.
function fetchUserName(userId: number): Promise<string> {
return Promise.resolve(`User ${userId}`)
}
function requestUserName(userId: number) {
return (dispatch: Dispatch) => {
return fetchUserName(userId).then(name => {
dispatch({
type: 'SET_USERNAME',
payload: name,
})
})
}
}
Таким образом, хранилище обновляется, позволяя компонентам обрабатывать ответ напрямую.
function User() {
const dispatch = useDispatch()
useEffect(() => {
dispatch(requestUserName(1))
.then(name => {
console.log(`user name is ${name}`)
})
.catch(reason => {
alert('failed fetching user name')
})
}, [])
}
Это работает как предназначен, но он не будет скомпилирован TypeScript из-за недопустимых типов.
-
dispatch
, возвращаемый useDispatch
, не распознается как функция, которая возвращает Promise, и поэтому TypeScript утверждает, что Property 'then' does not exist on type '(dispatch: Dispatch<AnyAction>) => Promise<void>'.
. - Даже если это будет признано, Обещание должно быть правильно напечатано
Как можно решить эту ситуацию?
Было бы прекрасно для меня создать оболочку вокруг useDispatch
или переопределить тип dispatch
, но я понятия не имею, как этот тип должен выглядеть в данной конкретной ситуации.
Большое спасибо за любые предложения.