Redux Sagas,TypeScript和电话?

时间:2017-01-16 16:20:17

标签: typescript redux-saga

作为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似乎试图解决此问题。我将保持开放,直到可以通过解决方案关闭它。

1 个答案:

答案 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确实需要参数,那么将推断出它的类型参数,并且将引发编译器错误。