作为TypeScript和redux-thunk用户,我很好奇redux-saga提供的好处。我想试一试,但我担心call
功能和类型安全的明显损失。
如果我这样做:
function* invalidateReddit(): SagaIterator {
while (true) {
const {reddit} = yield take(actions.INVALIDATE_REDDIT)
yield call( fetchPosts, reddit )
}
编译器无法检查对fetchPosts
的调用。因此,如果我将签名更改为不包含参数...
function fetchPosts() {
// anything here...
}
invalidateReddit
函数取决于fetchPosts
,应该无法编译但不会因为call
为我评估我的代码。在不牺牲类型安全性的情况下,是否存在使用此模式的确定模式?
更新:https://github.com/redux-saga/redux-saga/pull/740处的PR似乎试图解决此问题。我将保持开放,直到可以通过解决方案关闭它。
答案 0 :(得分:1)
因为TypeScript不会抱怨你传递给函数的多余变量。
作为类型声明本身, https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/redux-saga/index.d.ts#L75
export function call<T1, T2, T3>(fn: EffectFunction<T1, T2, T3>, arg1?: T1, arg2?: T2, arg3?: T3, ...rest: any[]): Effect;
如果将arity小于3的函数传递给call
,则所有类型参数都将推断为{}
,即TS的顶级类型。所以基本上每件事都可以在这样的电话call(zeroArityFunc, anything)
中分配。
在运行时,多余的参数不会导致错误,因此您的代码应该没问题。
如果fetchPosts
确实需要参数,那么将推断出它的类型参数,并且将引发编译器错误。