Redux-Saga模块增强SELECT效果 [英] Redux-saga Module augumentation for select effect

查看:0
本文介绍了Redux-Saga模块增强SELECT效果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望SELECT效果返回我的状态类型。为此,我使用了模块扩充

import { SelectEffect, Tail } from 'redux-saga/effects';

import { IReduxState } from 'reducers/rootReducer';

declare module 'redux-saga/effects' {
    export function select<Fn extends (state: IReduxState, ...args: any[]) => any>(
        selector: Fn,
        ...args: Tail<Parameters<Fn>>
    ): SelectEffect
}

问题是,当我尝试选择我的状态片段时,该状态未按预期键入

const users = yield select((state) => (state.users));

此处用户具有类型Any

我应该如何正确键入此效果?

推荐答案

问题在于,TypeScrip仍然不支持基于生成的表达式对注入值进行映射/类型推断。

2015年围绕这一点进行了一些讨论: https://github.com/Microsoft/TypeScript/issues/2983 https://github.com/microsoft/TypeScript/issues/2873

然而,result只是在TS3.6中为常见迭代器和返回类型提供了更好的支持(而不是像redux-saga这样的异步运行器),从那时起就没有做过任何其他的事情。请注意,redux-sagahere中利用了更好的返回类型支持,尽管这对您的情况没有帮助。

在Saga repo本身中有一些关于这个问题的disccusion,其中发现您实际上可以使用yield*语法的老套解决方案来绕过这个问题。实际上,有人在Redux Saga的基础上添加了这个解决方案: https://github.com/agiledigital/typed-redux-saga

它似乎适用于大多数情况,但在使用all效果等时存在多个不同类型的问题。

redux-saga中甚至有一个PR来支持redux-saga本身,但由于redux-saga的维护者忙于其他事情,它一直没有前进:

https://github.com/redux-saga/redux-saga/pull/2053

因此,目前唯一的解决方案是:

  • a)继续使用redux-saga,并为变量添加显式类型,从Year表达式向其赋值注入内容:
const value: Stuff = yield select(getStuff);
  • b)使用type-redux-saga

(当然,在这些情况下您也可以忽略类型)

这篇关于Redux-Saga模块增强SELECT效果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆