Redux Saga: тип 'unknown' нельзя присвоить типу 'ServerResponse' - PullRequest
0 голосов
/ 13 июля 2020

Описание проблемы:

Я не могу указать тип для yield call(). Выход вызывает API , который извлекает некоторые данные с сервера. Тип данных - ServerResponse . Я хочу указать тип следующим образом:

const response: ServerResponse = yield serverCall();

Но я Typescript выдает эту ошибку: Redux Saga: Type 'unknown' is not assignable to type 'ServerResponse'.

Код:

function* serverSaga(): Generator {
  try {
    // TS throws error here;
    const response: ServerResponse = yield serverCall();
    ...
    ...
  } catch (err) {
    ...
  }
}

const serverCall = async (): Promise<ServerResponse> => {
  try {
    const response =  await ...
    return response;
  } catch (err) {
    ...
  }
};

Ответы [ 2 ]

1 голос
/ 17 июля 2020

Все дали хорошие ответы, но в качестве альтернативы вы можете заглянуть в эту библиотеку, которая помогает решить проблему такого рода. Я нашел его очень полезным для подобных ситуаций.

0 голосов
/ 13 июля 2020

Я считаю, что вам нужно ввести свой Generator generi c, а также следует использовать call для фактического вызова функции asyn c:

import {
  call,
  CallEffect
} from "redux-saga/effects";

function* serverSaga(): Generator<CallEffect<ServerResponse>, void, never> {
  try {
    // TS throws error here;
    const response: ServerResponse = yield call(serverCall);
    ...
    ...
  } catch (err) {
    ...
  }
}

const serverCall = async (): Promise<ServerResponse> => {
  try {
    const response =  await ...
    return response;
  } catch (err) {
    ...
  }
};

Фактические типы, которые Генератор generi c может быть рассмотрен на следующем примере. Сложные саги могут сделать общие c тупыми.

type MyGen = Generator<
  number, // Outgoing (what you might yield)
  boolean, // What could be returned
  string // Incoming (left side of yield)
>;

function* MySaga(): MyGen {
  let outgoing = 0;
  while (outgoing < 10) {
    outgoing++;
    const incoming: string = yield outgoing;
    console.log(incoming);
  }
  return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...