如何在typescript中为包含yield*委托的redux saga生成器函数编写类型

如何在typescript中为包含yield*委托的redux saga生成器函数编写类型,typescript,redux-saga,Typescript,Redux Saga,我正在学习发电机和redux传奇。 我引用了一个使用收益率*的现有示例。 第一种方法是使用“yieldPromiseResponse”的yieldPromiseResponse。 第二种方法-watchPromise,它使用带有 错误:类型“ForkEffect”必须具有返回迭代器的“Symbol.iterator”方法 有人能告诉我这个例子应该用哪种类型吗 const at:TAt={ 成功:“成功”, }; 界面道具{ 用户名:字符串; } 接口GProps{ 有效载荷:道具; } 输入Tp

我正在学习发电机和redux传奇。 我引用了一个使用收益率*的现有示例。 第一种方法是使用“yieldPromiseResponse”的yieldPromiseResponse。 第二种方法-watchPromise,它使用带有

错误:类型“ForkEffect”必须具有返回迭代器的“Symbol.iterator”方法

有人能告诉我这个例子应该用哪种类型吗

const at:TAt={
成功:“成功”,
};
界面道具{
用户名:字符串;
}
接口GProps{
有效载荷:道具;
}
输入Tprom=(有效载荷:道具)=>Promise;
const prom:Tprom=username=>
新承诺((解决、拒绝)=>{
解析(`resolve prom uesrname=${username}`);
});
函数*yieldPromiseResponse({payload}:GProps){
/*eslint禁用无无用捕获*/
试一试{
const user=产量呼叫(prom,有效载荷);
log('user=',user);
产生put({type:at.SUCCESS,user});
}捕获(错误){
投掷误差;
}
}
函数*watchPromise(){
产量*takeLatest(应要求,产量承诺人响应);
}
出口违约承诺;

这里有两个问题。第一个是我设法修复的

问题1
  • 移除时*
  • 这将导致新的错误:

    没有与此调用匹配的重载。 上一次重载导致以下错误。 “string”类型的参数不能分配给“TakeableChannel”类型的参数

    这是因为typescript认为我使用takeLatest作为通道,而不是模式。

    • 最新的(模式、传奇,…参数)
    • 最新(频道,传奇,…args)
    在此处找到修复的答案:

    更新后的代码现在可以在typescript中识别,不会出现错误

    从'redux saga/effects'导入{put,call,takeLatest};
    从'redux'导入{Action};
    const ActionTypeRequest='REQUEST';
    界面道具{
    用户名:字符串;
    }
    接口ActionResult扩展了操作{
    类型:字符串;
    有效载荷?:T;
    }
    输入Tprom=(有效载荷:道具)=>Promise;
    const prom:Tprom=payload=>
    新承诺((解决、拒绝)=>{
    解析(`resolve prom uesrname=${payload.username}`);
    });
    函数*YieldPromiserResponse(操作:操作结果){
    /*eslint禁用无无用捕获*/
    const{payload}=动作;
    试一试{
    const user=yield call(prom,有效载荷作为道具);
    产生put({type:ActionTypeRequest,user});
    }捕获(错误){
    投掷误差;
    }
    }
    函数*watchPromise(){
    最新产量(ActionTypeRequest、YieldPromiserResponse);
    }
    出口违约承诺;
    
    问题2 仍然不适用于

    yield*takeLatest(ActionTypeRequest,yieldPromiseResponse);
    
    也许我需要理解收益率委托——收益率* 在阅读此文时—

    当我将代码更改为此时,它不会抱怨。 所以也许有人能解释我最新的方法中收益率的问题

    function* secondaryGenerator() {
      yield delay(111);
      return true;
    }
    
    function* watchPromise() {
      yield takeLatest(ActionTypeRequest, yieldPromiseResponse);
      const secondary = yield* secondaryGenerator();
      console.log('second = ', secondary);
    }
    

    我已经有一段时间没有做这个
    yield*
    了,所以我看到了错误,但我不确定解决方案。若你们可以链接到你们所基于的例子,那个将很有帮助。基本上,
    yield*
    后面需要一个迭代器
    takeLatest
    创建一个不是迭代器的
    ForkEffect
    。仅供参考
    prom
    函数中的变量
    username
    是一个具有属性
    username
    的对象,而不仅仅是用户名。你可能想解构
    =({username})=>
    @lindapaste谢谢你的回复。不是这样,但我找到了答案。将发布
    function* secondaryGenerator() {
      yield delay(111);
      return true;
    }
    
    function* watchPromise() {
      yield takeLatest(ActionTypeRequest, yieldPromiseResponse);
      const secondary = yield* secondaryGenerator();
      console.log('second = ', secondary);
    }