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);

完整示例:https://codesandbox.io/s/zry4vl2ymx(为方便起见,省略了其他类型定义。)

我不知道我做错了什么。如果您知道什么是问题以及如何解决,请帮助解决问题。谢谢! :)

最佳答案

当我遇到这个问题时,是因为我的传奇实际上并没有作为参数的 Action ——我认为你遇到了同样的事情。

takeEvery('set_number_async', set_number_async) 中,方法 set_number_async 的参数没有 type 属性,这意味着它的形状不像 Action 类型。 (请记住,typescript 中的类型是鸭子/结构体——它们只真正关心类型具有什么属性。)

如果我通过添加类型属性来更改签名,则该示例将编译:

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

关于reactjs - 如何修复在 redux-saga 中调用 takeEvery() 时发生 TypeScript 错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49851970/

10-10 00:20