Redux-saga:如何使用typeScript键入worker的参数

问题描述 投票:0回答:1

有没有办法使用打字稿来设置worker saga的参数类型?

我有这个界面

interface ITask{
    id: number
    task: string,
    //other things here
}

而且我有这个听众和工作人员:

function* addTaskSaga():any {
    yield takeEvery("TASK_ADD", workerAddTaskSaga);
}
function* workerAddTaskSaga({data}:any) {
  //other things here
}

此代码运行良好,但是我想强类型输入worker的参数,我的意思是:将{data}:any更改为data:ITask

但是这会引发异常:

The last overload gave the following error.
    Argument of type 'string' is not assignable to parameter of type 'TakeableChannel<unknown>'.ts(2769)
effects.d.ts(207, 17): The last overload is declared here.

有什么想法吗?

typescript redux-saga worker
1个回答
0
投票

如果问题仍然相关,这里是答案。

您应该定义一些接口,该接口将从redux扩展Action,然后将其作为类型参数传递给takeEvery。这将正确键入worker函数。

// This is Action interface which will hold type and payload. 
interface TaskAction extends Action, ITask {type: "TASK_ADD" }

// Alternatively you may use 
// interface TaskAction extends Action {type: "TASK_ADD", data: ITask }

interface ITask{
  id: number
  task: string,
  //other things here
}

function* addTaskSaga():any {
  yield takeEvery<TaskAction>("TASK_ADD", workerAddTaskSaga);
}

function* workerAddTaskSaga(data:TaskAction) {
  // data is of type TaskAction
  // data.id is number from ITask
  // data.task is string from ITask
}

// Or if you've chosen second form of TaskAction
//   function* workerAddTaskSaga({ data } : TaskAction) {
     // data is of type ITask
//   }
© www.soinside.com 2019 - 2024. All rights reserved.