Return type of a `yield call`

I've noticed that the result of a yield call effect is typed as any when used as

const data = yield call(f); 

while f is a () => Promise<number> function.

Am I missing something or is it a redux-saga typings limitation?

0

4 Answers

Check this ongoing thread, tldr; it's a typescript limitation

1

In the meantime, you can use this package instead: typed-redux-saga

Before

import { call, all } from "redux-saga/effects"; ... // Api.fetchUser return User // but user has type any const user = yield call(Api.fetchUser, action.payload.userId); 

After

import { call, all } from "typed-redux-saga"; ... // user now has the correct type User // NOTE: it's yield*, not yield const user = yield* call(Api.fetchUser, action.payload.userId); 

define this types

export type PromiseFn = (...args: any) => Promise<any>; export type GetT<T> = T extends Promise<infer N> ? N : any; export type GetFnResult<T extends PromiseFn> = GetT<ReturnType<T>>; 

then

const data: GetFnResult<typeof f> = yield call(f); 
2

You can use

const data = (yield call(f)) as number 
1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like