Javascript 角度5-返回另一个动态函数的函数

Javascript 角度5-返回另一个动态函数的函数,javascript,angular,typescript,ngrx,angular2-aot,Javascript,Angular,Typescript,Ngrx,Angular2 Aot,我创建了一个函数,该函数生成一个动态的switch case函数语句 export function generateReducer(initialState, reducerName: ReducerName, adapter: EntityAdapter<any>): (state, initialState) => IState { reducerName.plural = reducerName.plural ? reducerName.plural : reduc

我创建了一个函数,该函数生成一个动态的switch case函数语句

export function generateReducer(initialState, reducerName: ReducerName, adapter: EntityAdapter<any>): (state, initialState) => IState {
  reducerName.plural = reducerName.plural ? reducerName.plural : reducerName.singular + 's';

  return function (state = initialState, action: any): IState {
    switch (action.type) {

        case `[${reducerName.plural} Section] Load Statistics ${reducerName.singular}`:
        case `[${reducerName.plural} Section] Load Details ${reducerName.singular}`:
        case `[${reducerName.plural} Section] Load ${reducerName.plural}`:
            {
                return { ...state, loading: true, loaded: false };
            }
            ...
}
当使用
ng serve
(非AOT)运行项目时,一切正常,当尝试使用
ng build--prod为生产构建时,我得到以下错误

src\app\skills\skills.module.ts(46,45)中出现错误:模板创建过程中出错 中不支持编译'SkillsModule'函数调用 但“generateReducer”在“Reducer”中被称为“decorators” “还原器”引用“还原器” “reducers”在src\app\skills\store\reducers\index.ts(18,13)中引用了“reducer” “reducer”在src\app\skills\store\reducers\skills.reducer.ts(26,24)调用“generateReducer”

我试图找到任何方法来解决这个问题,但似乎我需要以某种方式将它提供给编译器,这样他就可以知道它是一个生成代码的编译时函数。关于如何处理这类问题有什么想法吗

编辑:

添加了stackblitz回购以显示错误

下载应用程序,更新package.json devdependences“@angular/cli”:“^1.6.0”, 并尝试运行“ng build--prod”

尝试在“reducer.ts”中添加:

这样对我来说很有效。。。
希望它能帮助

skills.module.ts(46,45)-这行代码是什么请删除。对于Feature('skillsSection',reducers),它是我实际使用此reducer并将其添加到存储模块的地方。哪个版本的ngrx和哪个版本的angular?angular 5.2.6,ngrx Latest这正是我想要的。非常感谢你!
export const initialState: State = adapter.getInitialState({
    loaded: false,
    loading: false,
    selectedId: null
});

export const reducer = generateReducer(initialState, { singular: 'Skill' }, adapter);
  export const reducer = generateReducer(initialState, { singular: 'Skill' }, adapter);

import { ActionReducerMap } from '@ngrx/store';
import { InjectionToken } from '@angular/core';

 // register reducer token
 export const reducerToken = new InjectionToken<ActionReducerMap<State>>(
   'Registered Reducers'
 );
 Object.assign(reducerToken, reducer);

 export function getReducers() {
   return reducer;
 }
import { reducerToken, getReducers } from './reducer';


@NgModule({
imports: [
    BrowserModule,
    FormsModule,
    StoreModule.forRoot(reducerToken)
 ],
 declarations: [AppComponent, HelloComponent],
 providers: [
  {
    provide: reducerToken,
    useFactory: getReducers
  }
 ],
 bootstrap: [AppComponent]
})