2017-01-16 154 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

你介意分享你的代碼嗎? –

相關問題