Тип возврата действия Redux при использовании отправки и getState

Я изо всех сил пытаюсь понять, какой тип возврата должен быть для моего действия. Все работает, пока я использую any, но стараюсь избегать использования any.

export const saveValue = (value: number): any => {
    return (dispatch: Dispatch<SaveValue>, getState: () => State): void => {
        axios.post('www.exampleurl.com', value)
            .then((response) => {
                const someValueFromState = getState().stateValue;
                const payload = {...response, someValueFromState}
                dispatch({ type: constants.SAVE_VALUE, payload });
            });
    };
};

У меня это работало раньше, когда действие не использовало getState(), и это выглядело так, где оно возвращало Dispatch<SaveValue>:

export const saveValue = (value: number): Dispatch<SaveValue> => {
    return (dispatch: Dispatch<SaveValue>): void => {
        axios.post('www.exampleurl.com', value)
            .then((response) => {
                dispatch({ type: constants.SAVE_VALUE, response });
            });
    };
};

Но как только я добавил getState, я больше не уверен, что делать. Я попытался поместить возвращаемое значение в переменную и вижу, что объект, который я создаю, это const myAttempt: (dispatch: Dispatch<SaveValue>, getState: () => State) => void, но когда я попытался использовать его следующим образом, он не работает:

export const saveValue = (value: number): (dispatch: Dispatch<SaveValue>, getState: () => StoreState) => void => {
    return (dispatch: Dispatch<SaveValue>, getState: () => State): void => {
        axios.post('www.exampleurl.com', value)
            .then((response) => {
                const someValueFromState = getState().stateValue;
                const payload = {...response, someValueFromState}
                dispatch({ type: constants.SAVE_VALUE, payload });
            });
    };
};

При этом получаю ошибку: A function whose declared type is neither 'void' nor 'any' must return a value.

РЕДАКТИРОВАТЬ:

Просто добавлю, что я не могу вернуть Dispatch<SaveValue> как раньше, иначе я получаю эту ошибку: Type '(dispatch: Dispatch<SaveValue>, getState: () => State) => void' is not assignable to type 'Dispatch<SaveValue>'


person Alan Schapira    schedule 11.06.2018    source источник
comment
Я думаю, вам все еще нужно только export const saveValue = (value: number): Dispatch<SaveValue> => {   -  person Shubham Khatri    schedule 11.06.2018
comment
Когда я это делаю, он говорит Type '(dispatch: Dispatch<SaveValue>, getState: () => State) => void' is not assignable to type 'Dispatch<SaveValue>'   -  person Alan Schapira    schedule 11.06.2018


Ответы (1)


Друг помог мне ответить на этот вопрос. Это был правильный способ сделать это:

export const saveValue = (value: number): (dispatch: Dispatch<SaveValue>, getState: () => State): void => {
    return (dispatch: Dispatch<SaveValue>, getState: () => State): void => {
        axios.post('www.exampleurl.com', value)
            .then((response) => {
                const someValueFromState = getState().stateValue;
                const payload = {...response, someValueFromState}
                dispatch({ type: constants.SAVE_VALUE, payload });
            });
    };
};

Проблема, с которой я столкнулся, была связана с моей функцией mapDispatchToProps, которая явно печаталась и вызывала ошибку Type '(dispatch: Dispatch<SaveVisit>, getState: () => StoreState) => void' is not assignable to type 'Dispatch<SaveVisit>'. Функция была:

interface MapDispatchToPropsInterface {
    saveValue : (value: number) => Dispatch<SaveValue>;
}

const mapDispatchToProps: MapDispatchToPropsInterface = {
    saveValue : ActionCreators.saveValue,
};

но интерфейс должен быть:

interface MapDispatchToPropsInterface {
    saveValue : (saveDetails: CheckedVisit) =>  (dispatch: Dispatch<SaveValue>, getState: () => StoreState) => void;
}
person Alan Schapira    schedule 18.06.2018
comment
Я получаю синтаксическую ошибку вокруг : void => в первой строке, когда пытаюсь это сделать. Кажется, что использование встроенного в react-redux ThunkAction является правильным подходом. Соответствующий поток . - person lawrence-witt; 12.03.2021