Dispatch nu returnează o promisiune folosind redux-thunk cu typescript


De fapt, migrez niște cod la TypeScript, așa că sunt nou în toate lucrurile astea legate de tipuri. Când foloseam redux-thunk cu JavaScript obișnuit, metoda dispatch returna o promisiune care mă ajuta să gestionez erorile și alte lucruri. Acțiunea era aceasta:

export const login = ({email, password}) => {
    return async function (dispatch) {
        try {
            const result = await api.post(`/auth/login`, {username, password});
            return dispatch({type: 'set_user_session', payload: result.data});
        } catch (err) {
            throw (err.response && err.response.data) || {code: err};
        }
    };
};

Apoi am sunat normal folosind hook-ul useDispatch:

const dispatch = useDispatch();
...
dispatch(login({username: "admin", password: "adminpassword1"}))
    .then(d => console.log("ok"))
    .catch(err => console.log(err));

Acum că am migrat codul la TypeScript, acțiunea arată acum așa:

export const login = ({username, password}: Credentials): ThunkAction<Promise<Action>, {}, {}, AnyAction> => {
    // Invoke API
    return async (dispatch: ThunkDispatch<{}, {}, AnyAction>): Promise<Action> => {
        try {
            const result = await api.post(`/auth/login`, {username, password});
            return dispatch({type: 'set_user_session', payload: result.data});
        } catch (err) {
            console.log(err);
            throw (err.response && err.response.data) || {code: err};
        }
    }
}

Acest lucru este executat fără probleme, dar dacă încerc să gestionez asta:

dispatch(login({username: "admin", password: "adminpassword1"}))
    .then(d => console.log("ok"))
    .catch(err => console.log(err));

Primesc această eroare:

TS2339: Property 'then' does not exist on type 'ThunkAction   >, {}, {}, AnyAction>'

Am încercat să citesc secțiunea despre tipuri în Redux, dar nu pot găsi modul corect de a declara această funcție dispatch pentru a funcționa așa cum am nevoie.

https://redux.js.org/recipes/usage-with-typescript

Ce este și mai rău este că primesc această eroare de rulare după ce acțiunea este executată:

Possible Unhandled Promise Rejection (id: 0):

Deci promisiunea este undeva.

Răspuns #1

Tipul de bază Dispatch nu cunoaște thunk-urile. Trebuie să deduci tipul modificat al store.dispatch care spune lui TS că thunk-urile sunt acceptabile, și atunci va înțelege că trimiterea thunk-ului returnează de fapt o promisiune.

Cea mai bună opțiune aici este să trecem la utilizarea pachetului nostru oficial Redux Toolkit și să deducem tipul store.dispatch așa cum este arătat aici:

https://redux-toolkit.js.org/tutorials/typescript

Apoi, poți folosi acel tip Dispatch îmbunătățit cu hook-ul useDispatch.

(Pentru ce merită, refacerea paginii de documentație principală Redux „Utilizare cu TS” este pe lista mea de lucruri de făcut pentru viitorul apropiat)