2017-01-16 5 views
9

Als TypScript- und Redux-Thunk-Benutzer bin ich neugierig auf die Vorteile von redux-saga. Ich möchte es eine Chance geben, bin aber besorgt über die call Funktion und den scheinbaren Verlust der Typsicherheit.Redux Sagas, TypeScript und Anruf?

Wenn ich dies tun:

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

Der Compiler wird nicht möglich sein, Anrufe zu fetchPosts zu überprüfen. Also, wenn ich die Unterschrift nicht verändert, das Argument zu schließen ...

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

Die invalidateReddit-Funktion, die auf fetchPosts abhängt, sollte nicht kompiliert, aber es wird nicht, weil call wertet meinen Code für mich. Gibt es ein etabliertes Muster für den Einsatz ohne Verzicht auf die Typensicherheit?

UPDATE: Die PR bei https://github.com/redux-saga/redux-saga/pull/740 sieht aus wie es versucht, dieses Problem zu lösen. Ich werde das offen lassen, bis es mit einer Lösung geschlossen werden kann.

+0

Scheint wie PR erwähnt in UPDATE funktioniert nicht. Ich habe den letzten Code für den Zweig ausprobiert und es ist 'jeder' Typ. Es ist wahrscheinlich ein Problem mit TypeScript selbst, sieht aber nicht so aus, als würden sie benutzerdefinierte Typen in yield-Anweisungen aktivieren. – Jurosh

Antwort

1

Da TypeScript keine überzähligen Variablen beschwert, die Sie an eine Funktion übergeben haben.

Als Typdeklaration 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; 

Wenn Sie eine Funktion mit arity weniger als 3-call, alle Parameter vom Typ {}, oben Typ TS wird passieren geschlossen. Also im Prinzip wird jedes Ding in solch einem Anruf call(zeroArityFunc, anything) zuweisbar sein.

Zur Laufzeit führt das Argument "excess" nicht zu einem Fehler, daher sollte Ihr Code in Ordnung sein. Wenn fetchPosts ein Argument erfordert, wird der Typparameter dafür abgeleitet, und ein Compilerfehler wird ausgelöst.

+0

Ich bin mir nicht sicher, ob ich das verstehe. Ich kann keinen Compilerfehler für irgendeinen Code auslösen, der 'call' im Moment benutzt, ungeachtet der Arity. Ich habe gerade eine offene PR bemerkt, https://github.com/redux-saga/redux-saga/pull/740, die das Problem, das ich beschreibe, lösen könnte. – subvertallchris

+1

Würde es Ihnen etwas ausmachen, Ihren Code zu teilen? –

Verwandte Themen