2017-01-16 18 views
9

Jako użytkownik TypeScript i redux-thunk jestem ciekawy korzyści, jakie oferuje saga redux. Chciałbym to zrobić, ale jestem zaniepokojony funkcją call i oczywistą utratą bezpieczeństwa typu.Sny Redux, TypeScript i call?

Gdybym to zrobić:

function* invalidateReddit(): SagaIterator { 
    while (true) { 
    const {reddit} = yield take(actions.INVALIDATE_REDDIT) 
    yield call(fetchPosts, reddit) 
    } 

Kompilator nie będzie mógł sprawdzić połączenia do fetchPosts. Więc gdybym zmienił podpis nie zawiera argumentu ...

function fetchPosts() { 
    // anything here... 
} 

Funkcją invalidateReddit, która zależy od fetchPosts, powinny nie skompilować, ale nie będzie, bo call ocenia mój kod dla mnie. Czy istnieje ustalony wzorzec używania tego bez poświęcania bezpieczeństwa typu?

UPDATE: PR na https://github.com/redux-saga/redux-saga/pull/740 wygląda na to, że próbuje rozwiązać ten problem. Zostawię to otwarte, dopóki nie zostanie zamknięte z rozwiązaniem.

+0

Wygląda na to, że PR wspomniany w UPDATE nie działa. Próbowałem najnowszego kodu oddziału i jest to typ "any". To prawdopodobnie problem z samym TypeScript, ale nie wygląda na to, że pracują nad włączaniem typów niestandardowych w instrukcjach 'yield'. – Jurosh

Odpowiedz

1

Ponieważ TypeScript nie będzie narzekać na nadmiar zmiennych przekazywanych do funkcji.

W deklaracji typu per se, 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; 

Jeśli przekazać funkcję o liczbę operandów mniej niż 3 do call, wszystko parametr typu będą wnioskować do {}, górnym typu TS. Więc w zasadzie każda rzecz będzie przypisywana w takim wywołaniu call(zeroArityFunc, anything).

W czasie wykonywania nadmierny argument nie spowoduje błędu, więc kod powinien być w porządku. Jeśli fetchPosts nie wymaga argumentu, wówczas zostanie wywołany jego parametr i zostanie zgłoszony błąd kompilatora.

+0

Nie jestem pewien, czy rozumiem. Nie mogę wywołać błędu kompilatora dla żadnego kodu, który w danym momencie używa 'call', niezależnie od arith. Właśnie zauważyłem otwarty PR, https://github.com/redux-saga/redux-saga/pull/740, który może być przeznaczony do rozwiązania problemu, który opisuję. – subvertallchris

+1

Czy mógłbyś podzielić się swoim kodem? –