import { combineLatest, Observable, of } from 'rxjs'; import { map, startWith } from 'rxjs/operators'; import { ValuesOf } from './types/utility-types'; export class ContextComponent { componentContext$: Observable | null = of({} as T); protected _initContext(context: Record>>): void { const observables = Object.values(context).map(obs => obs.pipe(startWith(null))); const keys = Object.keys(context); this.componentContext$ = combineLatest(observables).pipe(map(values => this._mapKeysToObs(keys, values))); } protected _mapKeysToObs(keys: string[], observables: (ValuesOf | null)[]): T { return keys.reduce((acc, key, index) => ({ ...acc, [key]: observables[index] }), {} as T); } }