Redux-saga: Как набрать рабочий параметр с помощью typeScript - PullRequest
0 голосов
/ 23 октября 2019

Есть ли способ использовать машинописный текст для установки типа параметра в рабочей саге?

У меня есть этот интерфейс

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

И у меня есть этот слушатель и работник:

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

Этот код работает хорошо, однако я хочу строго набрать параметр работника, я имею в виду: изменить {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.

Есть идеи?

1 Ответ

1 голос
/ 28 октября 2019

Если вопрос по-прежнему актуален, вот ответ.

Вы должны определить некоторый интерфейс, который расширяет Action от избыточного, а затем передать его в качестве аргумента типа в takeEvery. Это правильно наберет рабочую функцию.

// 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
//   }
...