import { Observable } from 'rxjs'; import { distinctUntilChanged, map } from 'rxjs/operators'; export type PropsHelper = { props: Props; props$: Observable; getProp(key: K): Observable; getProps>( ...keys: Keys ): Observable< { [Key in keyof Keys]: Keys[Key] extends keyof Props ? Props[Keys[Key]] : never; } >; }; export const createGetProp = (props$: Observable) => function getProp(key: K): Observable { return props$.pipe( map(props => props[key]), distinctUntilChanged() ); }; export const createGetProps = (props$: Observable) => function getProps>( ...keys: Keys ): Observable< { [Key in keyof Keys]: Keys[Key] extends keyof Props ? Props[Keys[Key]] : never; } > { const r = props$.pipe( distinctUntilChanged((p, q) => { for (let i = 0, l = keys.length; i < l; i += 1) { const name = keys[i]; if (p[name] !== q[name]) { return false; } } return true; }), map(props => keys.map(key => props[key])) ); return r as any; };