Redux Sagas, TypeScript och call?


Som en TypeScript- och redux-thunk-användare är jag nyfiken på de fördelar som erbjuds av redux-saga. Jag skulle vilja ge det ett försök men är orolig för call-funktionen och den uppenbara förlusten av typ-säkerhet.

Om jag gör detta:

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

Kompilatorn kommer inte att kunna kontrollera anrop till fetchPosts. Så om jag ändrade signaturen för att inte inkludera argumentet...

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

Funktionen invalidateReddit, som är beroende av fetchPosts, bör misslyckas med att kompileras men det gör den inte eftersom call utvärderar min kod åt mig. Finns det ett etablerat mönster för att använda detta utan att offra typ-säkerhet?

UPPDATERING: PR på https://github.com/redux-saga/redux-saga/pull/740 verkar försöka lösa detta problem. Jag kommer att lämna detta öppet tills det kan stängas med en lösning.

Svar #1

Eftersom TypeScript inte kommer att klaga på överflödiga variabler som du skickade till en funktion.

Som typdeklarationen i sig, 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;

Om du skickar en funktion med aritet mindre än 3 till call, kommer alla typparametrar att härledas till {}, den översta typen i TS. Så i princip kommer allt att kunna tilldelas i ett sådant anrop call(zeroArityFunc, anything).

Vid körning kommer ett överskjutande argument inte att orsaka fel, så din kod borde vara okej. Om fetchPosts kräver argument kommer typparametern för det att härledas och ett kompileringsfel kommer att uppstå.

Relaterade artiklar