typescript - Redux Sagas、TypeScript 和调用?

标签 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应该编译失败但不会因为调用为我评估我的代码。在不牺牲类型安全的情况下,是否有既定的模式来使用它?

更新: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/

相关文章:

angular - 以 ECMAScript 2015 模块为目标时不能使用导入赋值

reactjs - 使用 catch 在 redux-saga 中处理 Rest API axios 错误

reactjs - 如何在 redux-saga 中等待 saga 的执行完成?

reactjs - Redux Saga 的好例子

javascript - Chrome 消息扩展程序 : From injected script to background

typescript - 在 Typescript 中混入抽象基类

angular - 找不到模块 'date-fns'

javascript - 我应该使用 Redux Saga 进行 React Navigation 吗?

javascript - 如何使用 Redux-Saga 避免重复的 API 请求?

typescript - nestjs 如何工作并使用参数运行构造函数