diff --git a/modules/effects/src/effect_creator.ts b/modules/effects/src/effect_creator.ts index 4718f1c9cb..8e5b85fb9f 100644 --- a/modules/effects/src/effect_creator.ts +++ b/modules/effects/src/effect_creator.ts @@ -61,7 +61,9 @@ export function createEffect< return effect; } -export function getCreateEffectMetadata(instance: T): EffectMetadata[] { +export function getCreateEffectMetadata< + T extends { [props in keyof T]: Object } +>(instance: T): EffectMetadata[] { const propertyNames = Object.getOwnPropertyNames(instance) as Extract< keyof T, string diff --git a/modules/effects/src/effect_decorator.ts b/modules/effects/src/effect_decorator.ts index 7b12251678..bcae2f2666 100644 --- a/modules/effects/src/effect_decorator.ts +++ b/modules/effects/src/effect_decorator.ts @@ -1,14 +1,15 @@ import { compose } from '@ngrx/store'; -import { EffectMetadata, EffectConfig } from './models'; + +import { EffectConfig, EffectMetadata, EffectPropertyKey } from './models'; import { getSourceForInstance } from './utils'; const METADATA_KEY = '__@ngrx/effects__'; -export function Effect({ +export function Effect({ dispatch = true, resubscribeOnError = true, -}: EffectConfig = {}): PropertyDecorator { - return function>( +}: EffectConfig = {}) { + return function>( target: T, propertyName: K ) { @@ -21,7 +22,7 @@ export function Effect({ resubscribeOnError, }; setEffectMetadataEntries(target, [metadata]); - } as (target: {}, propertyName: string | symbol) => void; + }; } export function getEffectDecoratorMetadata( @@ -35,7 +36,7 @@ export function getEffectDecoratorMetadata( return effectsDecorators; } -function setEffectMetadataEntries( +function setEffectMetadataEntries( sourceProto: T, entries: EffectMetadata[] ) { @@ -50,8 +51,12 @@ function setEffectMetadataEntries( Array.prototype.push.apply(meta, entries); } -function getEffectMetadataEntries(sourceProto: T): EffectMetadata[] { +function getEffectMetadataEntries( + sourceProto: T +): EffectMetadata[] { return sourceProto.constructor.hasOwnProperty(METADATA_KEY) - ? (sourceProto.constructor as any)[METADATA_KEY] + ? (sourceProto.constructor as typeof sourceProto.constructor & { + [METADATA_KEY]: EffectMetadata[]; + })[METADATA_KEY] : []; } 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 };