Javascript 角度5-返回另一个动态函数的函数
我创建了一个函数,该函数生成一个动态的switch case函数语句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
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]
})