m0a / typescript-fsa-redux-observable

TypeScript FSA utilities for redux-observable
MIT License
28 stars 6 forks source link

support RxJS 6 #6

Open teramotodaiki opened 6 years ago

teramotodaiki commented 6 years ago

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!

jollytoad commented 5 years ago

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))