Redux-Saga模块增强SELECT效果

人气:42 发布:2023-01-03 标签: typescript redux-saga

问题描述

我希望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

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

14