作为 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
,应该编译失败但不会因为调用
为我评估我的代码。在不牺牲类型安全的情况下,是否有既定的模式来使用它?
更新:PR 位于 https://github.com/redux-saga/redux-saga/pull/740看起来它试图解决这个问题。我将保持开放状态,直到可以通过解决方案将其关闭。
最佳答案
因为 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;
如果您将一个参数小于 3 的函数传递给 call
,所有类型参数将被推断为 {}
,即 TS 的顶级类型。所以基本上所有的东西都可以在这样的调用中分配 call(zeroArityFunc, anything)
。
在运行时,过多的参数不会导致错误,因此您的代码应该没问题。
如果 fetchPosts
确实需要参数,那么它的类型参数将被推断出来并引发编译器错误。
关于typescript - Redux Sagas、TypeScript 和调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41680695/