typescript-fsa-redux-observable icon indicating copy to clipboard operation
typescript-fsa-redux-observable copied to clipboard

support RxJS 6

Open teramotodaiki opened this issue 6 years ago • 1 comments

Thank you for useful module :)

This is a proposal (not PR). In rxjs version 6, it is recommended to use pipe instead of prototype. https://github.com/ReactiveX/rxjs/blob/91088dae1df097be2370c73300ffa11b27fd0100/doc/pipeable-operators.md

Here is a pipeable operator of ofAction.

import { ActionsObservable } from 'redux-observable';
import { Action, ActionCreator } from 'typescript-fsa';
import { filter } from 'rxjs/operators';
import { MonoTypeOperatorFunction } from 'rxjs';

export function ofAction<P>(
  actionCreator: ActionCreator<P>
): MonoTypeOperatorFunction<Action<P>> {
  return function(actions$) {
    return actions$.pipe(filter(actionCreator.match)) as ActionsObservable<
      Action<P>
    >;
  };
}

e.g.

import { ofAction } from 'typescript-fsa-redux-observable';

action$.pipe(
    ofAction(actions.someActionCreator),
    map(action => actions.otherActionCreator)
);

I think this is not the best answer, but it works. Thanks!

teramotodaiki avatar Jul 19 '18 14:07 teramotodaiki

Thanks @teramotodaiki, I've just updated to Typescript 3.0 & redux-observable 1.0.0 & RxJS 6.x ... your suggestion was very helpful in migration. I've refined the ofAction a little further if you are interested.

This also make use of the new unknown type in TS 3, which is very useful in modelling Actions with an unknown payload, narrowing from an Action<unknown> to Action<P>...

export const ofAction = <P>(actionCreator: ActionCreator<P>): OperatorFunction<Action<unknown>, Action<P>> =>
    (actions$): Observable<Action<P>> =>
        actions$.pipe(filter(actionCreator.match))

jollytoad avatar Aug 27 '18 08:08 jollytoad