我们可以使用MetaReducer的概念,它是一个高级的Reducer。这里有一个典型的例子:LoggerMetaReducer。这个高级Reducer在实际reducer执行之前添加了一些日志消息:('状态',状态);console.log('动作',动作);返回减速器(状态,动作);};}logger的输入是一个reducer,返回一个与输入reducer签名完全相同的新reducer,在这个新reducer中,会先进行logging操作。这有点像Java中的面向切片编程(AOP)。所示的logger()meta-reducer函数采用ActionReducer类型的输入参数(即纯函数或reducer),并返回ActionReducer类型的函数。返回的函数在返回包装的reducer之前将状态和操作变量记录到控制台。回到AppModule代码中,定义一组ModuleWithProviders类来包装StoreDevtoolsModule.instrument()方法,以便以后可以在AppModule中导入它。exportconststoreDevTools:ModuleWithProviders[]=!environment.production?[StoreDevtoolsModule.instrument()]:[];最后将上面的ModuleWithProviders导入到AppModule中:StoreModule.forRoot((reducers)asany,{metaReducers}),EffectsModule.forRoot(effects),storeDevTools,其实StoreModule.forRoot()方法也可以接收第二个参数,类型为StoreConfig接口:exportdeclaretypeStoreConfig
