【问题标题】:Redux-saga Module augumentation for select effect用于选择效果的 Redux-saga 模块增强
【发布时间】:2021-11-21 16:12:24
【问题描述】:

我希望选择效果返回我的状态类型。我正在为此使用模块增强

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));

这里 users 的类型为 any

我应该如何正确输入这个效果?

【问题讨论】:

  • IReduxState 的代码是什么?
  • 编译器错误说明了什么?

标签: typescript redux-saga


【解决方案1】:

由于state的类型很好(它的类型是IReduxState),并且state.users下存在编译器错误,我想说问题是IReduxState接口没有users属性.

【讨论】:

    【解决方案2】:

    问题是 Typescript 仍然不支持基于产生的表达式的注入值的映射/类型推断。

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

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

    在 saga repo 本身中有一些 disccusion 围绕此问题,发现您实际上可以通过使用 yield* 语法的 hacky 解决方案来解决此问题。实际上有人继续在 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 并为变量添加显式类型,您可以从 yield 表达式中将注入的东西分配给这些变量:
    const value: Stuff = yield select(getStuff);
    
    • b) 使用 typed-redux-saga

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

    【讨论】:

      猜你喜欢
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多