创建一个将为您创建元缩减器的函数。此函数接受一个参数,指示它是否用于生产模式。
export function createMetaReducers(freeze = false): MetaReducer<State>[] {
return freeze
? [storeFreeze]
: [];
}
像这样,您的库并不关心您是否处于生产模式,而是您的库的用户可以决定。
关于您的评论的更新
我已经创建了一个函数,但我不能在我的 app.module.ts 中的导入部分中使用这个函数,在我这样做之前:'StoreModule.forRoot(reducers, { metaReducers }),' 现在我已经尝试过了使用新函数 StoreModule.forRoot(reducers, { createMetaReducers(true) }) 但得到错误:“类型的参数 '{ createMetaReducers(: any): any; }' 不可分配给类型为 'StoreConfig' 的参数。”您将如何解决这个问题?
您已经解决了您的问题,但我想解释一下发生了什么。
Typescript 和现代 ECMA 脚本有一些语法糖来缩短某些内容。
假设您有一个要为其指定名称的对象:
const obj: any = { name: 'Tom' }
现在我们可能不会对名称进行硬编码,而是将其放在名为 name 的变量中。那么代码是这样的:
const name: string = 'Tom';
const obj: any = { name: name };
您可以看到该变量与对象中的字段命名相同。如果是这种情况,您可以简单地删除 : name 部分并这样写:
const name: string = 'Tom';
const obj: any = { name };
这段代码 sn-p 和上面的代码一样。
这叫做Object Literal Property Value Shorthand(如果我弄错了,请大家纠正我)你可以在这里找到更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer
现在回到您的代码。 StoreModule.forRoot 需要两个参数。第二个参数是一个配置对象,你可以在其中传入 meta reducers
StoreModule.forRoot(reducers, { metaReducers: [] })
因此,要解决此问题,您有 2 种可能性。
你做的很好:
const metaReducers = createMetaReducers();
StoreModule.forRoot(reducers, { metaReducers })
解决此问题的另一种方法是以下方法:
StoreModule.forRoot(reducers, { metaReducers: createMetaReducers() })