From e7ae8a228ee4338b6beac4baf0bba745fa32c917 Mon Sep 17 00:00:00 2001 From: Alex Okrushko Date: Thu, 5 Jul 2018 08:47:35 -0400 Subject: [PATCH] refactor(effects): cleanup metadata and add types (#1131) Closes #623 --- modules/effects/src/effects_metadata.ts | 56 +++++++++++++------------ modules/effects/src/on_run_effects.ts | 16 +++---- 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/modules/effects/src/effects_metadata.ts b/modules/effects/src/effects_metadata.ts index 150f94a702..56db0f382c 100644 --- a/modules/effects/src/effects_metadata.ts +++ b/modules/effects/src/effects_metadata.ts @@ -1,20 +1,26 @@ import { compose } from '@ngrx/store'; const METADATA_KEY = '__@ngrx/effects__'; -const r: any = Reflect; -export interface EffectMetadata { - propertyName: string; +export interface EffectMetadata { + propertyName: keyof T; dispatch: boolean; } -function getEffectMetadataEntries(sourceProto: any): EffectMetadata[] { - return sourceProto.constructor[METADATA_KEY] || []; +function getEffectMetadataEntries(sourceProto: T): Array> { + return sourceProto.constructor.hasOwnProperty(METADATA_KEY) + ? (sourceProto.constructor as any)[METADATA_KEY] + : []; } -function setEffectMetadataEntries(sourceProto: any, entries: EffectMetadata[]) { +function setEffectMetadataEntries( + sourceProto: T, + entries: Array> +) { const constructor = sourceProto.constructor; - const meta: EffectMetadata[] = constructor.hasOwnProperty(METADATA_KEY) + const meta: Array> = constructor.hasOwnProperty( + METADATA_KEY + ) ? (constructor as any)[METADATA_KEY] : Object.defineProperty(constructor, METADATA_KEY, { value: [] })[ METADATA_KEY @@ -22,36 +28,32 @@ function setEffectMetadataEntries(sourceProto: any, entries: EffectMetadata[]) { Array.prototype.push.apply(meta, entries); } -export function Effect({ dispatch } = { dispatch: true }): PropertyDecorator { - return function(target: any, propertyName: string) { - const metadata: EffectMetadata = { propertyName, dispatch }; - setEffectMetadataEntries(target, [metadata]); - } /*TODO(#823)*/ as any; +export function Effect({ dispatch = true } = {}): PropertyDecorator { + return function(target: T, propertyName: keyof T) { + const metadata: EffectMetadata = { propertyName, dispatch }; + setEffectMetadataEntries(target, [metadata]); + } as (target: {}, propertyName: string | symbol) => void; } -export function getSourceForInstance(instance: Object): any { +export function getSourceForInstance(instance: T): T { return Object.getPrototypeOf(instance); } -export const getSourceMetadata = compose( - getEffectMetadataEntries, - getSourceForInstance -); +export function getSourceMetadata(instance: T): Array> { + return compose( + getEffectMetadataEntries, + getSourceForInstance + )(instance); +} -export type EffectsMetadata = { - [key in keyof T]?: - | undefined - | { - dispatch: boolean; - } -}; +export type EffectsMetadata = { [key in keyof T]?: { dispatch: boolean } }; export function getEffectsMetadata(instance: T): EffectsMetadata { const metadata: EffectsMetadata = {}; - getSourceMetadata(instance).forEach(({ propertyName, dispatch }) => { - (metadata /*TODO(#823)*/ as any)[propertyName] = { dispatch }; - }); + for (const { propertyName, dispatch } of getSourceMetadata(instance)) { + metadata[propertyName] = { dispatch }; + } return metadata; } diff --git a/modules/effects/src/on_run_effects.ts b/modules/effects/src/on_run_effects.ts index b1dc4042af..3bb6a9e486 100644 --- a/modules/effects/src/on_run_effects.ts +++ b/modules/effects/src/on_run_effects.ts @@ -3,17 +3,19 @@ import { Observable } from 'rxjs'; import { EffectNotification } from './effect_notification'; import { getSourceForInstance } from './effects_metadata'; +export type onRunEffectsFn = ( + resolvedEffects$: Observable +) => Observable; + export interface OnRunEffects { - ngrxOnRunEffects( - resolvedEffects$: Observable - ): Observable; + ngrxOnRunEffects: onRunEffectsFn; } -const onRunEffectsKey: keyof OnRunEffects = 'ngrxOnRunEffects'; +export const onRunEffectsKey: keyof OnRunEffects = 'ngrxOnRunEffects'; -export function isOnRunEffects( - sourceInstance: Object -): sourceInstance is OnRunEffects { +export function isOnRunEffects(sourceInstance: { + [onRunEffectsKey]?: onRunEffectsFn; +}): sourceInstance is OnRunEffects { const source = getSourceForInstance(sourceInstance); return (