Búsqueda de sitios web

reactjs - ¿Cómo solucionar el error de TypeScript que ocurre al llamar a takeEvery() en redux-saga?


import { createAction, handleActions } from 'redux-actions';
import { delay } from 'redux-saga';
import { all, put, takeEvery } from 'redux-saga/effects';

export const action_creators = {
    get_action_of_set_number: createAction<{ number:number }>('set_number'),
    get_action_of_set_number_async: createAction<{ number:number }>('set_number_async')
};

const state = {
    number: 0
}

function* set_number_async(action: { payload: { number:number } }) {
    yield delay(1000);
    yield put(action_creators.get_action_of_set_number(action.payload));
}

export function* saga(action) {
    yield all([takeEvery('set_number_async', set_number_async)]);
    *** Error message : Argument of type '"set_number_async"' is not assignable
    *** to parameter of type 'Channel<{ payload: { number:number; }; }>'.
}

export default handleActions({
    set_number: (state, action) => {
        const new_number = action.payload!.number;
        return { ...state, number:new_number };
    }
}, state);

ejemplo completo: https://codesandbox.io/s/zry4vl2ymx (Otras definiciones de tipo se omiten por conveniencia.)

No sé qué hice mal. Si sabes cuál es el problema y cómo solucionarlo, por favor ayuda a resolver el problema. ¡Gracias! :)

Respuesta #1

Cuando me encontré con este problema, fue porque mi saga en realidad no tenía una acción como su argumento; creo que te estás encontrando con lo mismo.

En takeEvery('set_number_async', set_number_async), el argumento del método set_number_async no tiene una propiedad tipo, lo que significa que no tiene la forma del tipo Action. (Recuerda que los tipos en TypeScript son por pato/estructurales: realmente solo les importa qué propiedades tiene un tipo.)

Si cambio la firma agregando una propiedad de tipo, el ejemplo se compila:

function* set_number_async(action: { payload: { number:number }, type:string }) {
    yield delay(1000);
    yield put(action_creators.get_action_of_set_number(action.payload));
}

Artículos relacionados