diff --git a/modules/effects/src/effect_decorator.ts b/modules/effects/src/effect_decorator.ts index 1ab618d03d..bcae2f2666 100644 --- a/modules/effects/src/effect_decorator.ts +++ b/modules/effects/src/effect_decorator.ts @@ -1,6 +1,6 @@ import { compose } from '@ngrx/store'; -import { EffectConfig, EffectMetadata } from './models'; +import { EffectConfig, EffectMetadata, EffectPropertyKey } from './models'; import { getSourceForInstance } from './utils'; const METADATA_KEY = '__@ngrx/effects__'; @@ -8,8 +8,8 @@ const METADATA_KEY = '__@ngrx/effects__'; export function Effect({ dispatch = true, resubscribeOnError = true, -}: EffectConfig = {}): PropertyDecorator { - return function>( +}: EffectConfig = {}) { + return function>( target: T, propertyName: K ) { diff --git a/modules/effects/src/effect_notification.ts b/modules/effects/src/effect_notification.ts index 3784f90387..952a1c1716 100644 --- a/modules/effects/src/effect_notification.ts +++ b/modules/effects/src/effect_notification.ts @@ -4,7 +4,7 @@ import { Notification, Observable } from 'rxjs'; export interface EffectNotification { effect: Observable | (() => Observable); - propertyName: string; + propertyName: PropertyKey; sourceName: string; sourceInstance: any; notification: Notification; @@ -46,7 +46,7 @@ function getEffectName({ }: EffectNotification) { const isMethod = typeof sourceInstance[propertyName] === 'function'; - return `"${sourceName}.${propertyName}${isMethod ? '()' : ''}"`; + return `"${sourceName}.${String(propertyName)}${isMethod ? '()' : ''}"`; } function stringify(action: Action | null | undefined) { diff --git a/modules/effects/src/effects_metadata.ts b/modules/effects/src/effects_metadata.ts index 18aaebd6f5..292001fe6d 100644 --- a/modules/effects/src/effects_metadata.ts +++ b/modules/effects/src/effects_metadata.ts @@ -3,17 +3,16 @@ import { getCreateEffectMetadata } from './effect_creator'; import { getEffectDecoratorMetadata } from './effect_decorator'; export function getEffectsMetadata(instance: T): EffectsMetadata { - const metadata: EffectsMetadata = {}; - - for (const { - propertyName, - dispatch, - resubscribeOnError, - } of getSourceMetadata(instance)) { - metadata[propertyName] = { dispatch, resubscribeOnError }; - } - - return metadata; + return getSourceMetadata(instance).reduce( + ( + acc: EffectsMetadata, + { propertyName, dispatch, resubscribeOnError } + ) => { + acc[propertyName] = { dispatch, resubscribeOnError }; + return acc; + }, + {} + ); } export function getSourceMetadata(instance: T): EffectMetadata[] { diff --git a/modules/effects/src/models.ts b/modules/effects/src/models.ts index 64633f1743..06d9a1238d 100644 --- a/modules/effects/src/models.ts +++ b/modules/effects/src/models.ts @@ -13,10 +13,16 @@ export interface EffectConfig { resubscribeOnError?: boolean; } -export interface EffectMetadata extends Required { - propertyName: Extract; +export type EffectPropertyKey = Exclude< + keyof T, + keyof Object +>; + +export interface EffectMetadata + extends Required { + propertyName: EffectPropertyKey; } export type EffectsMetadata = { - [key in Extract]?: EffectConfig + [key in EffectPropertyKey]?: EffectConfig };