“MY_EVENTS_LOAD”类型的参数不可分配给 yield takeLatest 中类型“TakeableChannel<unknown>”的参数

Coo*_*ife 8 javascript typescript reactjs redux-saga

我在打字稿上有错误,我使用 Redux 和 Saga 作为中间件,这是错误:

没有重载匹配这个调用。最后一次重载给出了以下错误。“MY_EVENTS_LOAD”类型的参数不可分配给“TakeableChannel”类型的参数。

我想在这里创建一个观察者:

export default function* watcher() {
  yield takeEvery(actions.MY_EVENTS_LOAD, getListEventsByUserSaga);
}
Run Code Online (Sandbox Code Playgroud)

在我的 saga 文件中有这个功能

export function* getListEventsByUserSaga(OwnerId: string) {
  try {
    const events = yield getEventsByOwnerId(OwnerId);
    yield put(actions.fetchMyEventsListUserSuccess(events));
  } catch (error) {
    yield put(actions.fetchMyEventsListUserFailure(error.message));
  }
}
Run Code Online (Sandbox Code Playgroud)

当我采取行动时会发生这种情况:

export const fetchMyEventsListUserLoad = (OwnerId: string) => {
  return {
    type: MY_EVENTS_LOAD,
    OwnerId,
  };
};
Run Code Online (Sandbox Code Playgroud)

如何以正确的方式实施这些?

小智 5

在 getListEventsByUserSaga 生成器中,您将操作声明为{OwnerId:string}没有类型。如果您尝试用类型声明它,这将消除错误。您可以使用ReturnType

export function* getListEventsByUserSaga({OwnerId} : ReturnType<typeof fetchMyEventsListUserLoad>) {
  try {
    // code
  } catch (error) {
    // code
  }
}
Run Code Online (Sandbox Code Playgroud)

https://github.com/redux-saga/redux-saga/issues/1883


Mar*_*ini 5

您可以做什么(至少在我的情况下我做了什么)是链接中指出的。目前,您似乎只将OwnerId字符串输出到生成器,这不应该像现在这样工作,因为那里的生成器基本上接受调度的参数、具有类型的对象以及发送到调度程序的其余参数。“正确”的做法是拥有一个包含该类型的类型定义,例如:

type Params = { OwnerId: string, type: string }
export function* getListEventsByUserSaga({ OwnerId }: Params) {
...
}
Run Code Online (Sandbox Code Playgroud)