问题描述
我希望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
(当然,在这些情况下您也可以忽略类型)