К сожалению, левая сторона yield
всегда имеет тип any
. Это потому, что функция генератора в принципе может быть возобновлена с любым значением. Redux saga ведет себя предсказуемо при запуске генераторов, но ничто не мешает кому-то писать другой код, который проходит через вашу сагу и дает вам значения, не связанные с тем, что вы получили, например:
const iterator = workerRefreshTaskSaga();
iterator.next();
// You might have been expecting a ServerResponse, but too bad, you're getting a string.
iterator.next('hamburger');
Onlyесли вы можете предположить, что в вашем генераторе используется редукс-сага, можете ли вы делать прогнозы о типах, а у машинописного текста нет способа сказать: «предположим, что этот генератор будет запускаться сагой-редуктом (и всеми вытекающими последствиями)».
Так что вам нужно будет добавить типы самостоятельно. Например:
const resp: ServerResponse = yield call(apiFetch, 'url');
Это означает, что вы несете ответственность за правильность типов. Поскольку машинопись может только сказать, что это any
, она будет доверять вам то, что вы говорите, типа. Таким образом, машинопись может проверить, что код, следующий за этим, правильно взаимодействует с ServerResponse
, но если на самом деле это не ServerResponse
, машинопись не может указать вам на это.
Одна вещь, которую я часто делаю, чтобы получитьнемного больше безопасности типов - это использование ReturnType
, например:
const output: ReturnType<someFunction> = yield call(someFunction);
Мне все еще нужно знать, что ReturnType<someFunction>
правильно, но, если я это сделал, то если кто-то изменит реализацию someFunctionчтобы заставить его возвращать что-то другое, тип вывода будет обновлен для соответствия.