2017-01-16 156 views
9

作为一个TypeScript和Redux-thunk用户,我很好奇由redux-saga提供的好处。我想尝试一下,但担心功能和类型安全性的明显损失。Redux Sagas,TypeScript和调用?

如果我这样做:

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公关看起来像它试图解决这个问题。我将保持开放状态,直到解决方案关闭。

+0

似乎更新提到的公关不起作用。我试过最新的分支代码,它是'任何'类型的。这可能是TypeScript本身的问题,但看起来他们并没有在'yield'语句中启用自定义类型。 – Jurosh

回答

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; 

如果传递与元数小于3至call的功能,所有的类型参数将被推断为{},顶部的TS。所以基本上每一件事都可以在call(zeroArityFunc, anything)这样的呼叫中分配。

在运行时,多余的参数不会导致错误,所以你的代码应该没问题。 如果fetchPosts确实需要参数,那么将推断它的类型参数,并且会引发编译器错误。

+0

我不确定我的理解。无论何时使用'call',我都无法触发编译器错误。我只注意到一个开放的PR,https://github.com/redux-saga/redux-saga/pull/740,可能是为了解决我所描述的问题。 – subvertallchris

+1

你介意分享你的代码吗? –

相关问题