Тип возвращаемого действия Redux при использовании dispatch и getState - PullRequest
0 голосов
/ 11 июня 2018

Я изо всех сил пытаюсь выяснить, какой тип возврата должен быть для моего действия.Все работает, пока я использую 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>'

1 Ответ

0 голосов
/ 18 июня 2018

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

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;
}
...