【问题标题】:Typescript 2.1.5 Function calls are not supported不支持 Typescript 2.1.5 函数调用
【发布时间】:2017-06-06 12:11:33
【问题描述】:

我有以下ngrx reducer函数

export const raceReducer: ActionReducer<IRace> = ( state: IRace = new Race(), action?: Action ) => {
  switch ( action.type ) {

    case RaceActions.ADD_OLP:
      return ngrxStateUpdater( state, action )

    default:
      return state;
  }
};

运行应用程序会出现以下错误:

错误中的错误遇到静态解析符号值。 不支持函数调用。考虑更换功能或 lambda 引用导出的函数(位置 40:50 在 原始 .ts 文件),解析 J:/wor 中的符号 raceReducer kspace/angular2/ts/epimss/src/app/registration/race/race.ngrx-store.ts, 解析符号 l AppModule in J:/workspace/angular2/ts/epimss/src/app/app.module.ts,解析 符号 AppModule 中 J:/workspace/angular2/ts/epimss/src/app/app.module.ts,解析 符号 App pModule in J:/workspace/angular2/ts/epimss/src/app/app.module.ts

所指的函数是

( state: IRace = new Race(), action?: Action )

为什么会这样,解决方案是什么。我认为这应该是合法的 typescript2.1.5 代码,但似乎不是这样。

谢谢

【问题讨论】:

  • 您在哪里以及如何使用raceReducer
  • reducer 被用作@ngrx/store 的一部分。它用于添加一个 Action 来更新 store 中的状态。以下是 app.module :导入:[StoreModule.provideStore({race:raceReducer})]

标签: angular typescript2.1


【解决方案1】:

AoT 需要静态分析一些代码,不能分析函数调用。

有关 AoT 限制的更多详细信息,请参阅https://github.com/qdouble/angular-webpack2-starter#aot--donts

有关讨论,请参阅此问题https://github.com/angular/angular/issues/11262

【讨论】:

    【解决方案2】:

    这似乎不是微不足道的,至于ngrx 看起来答案是使用 angular 的InjectionToken 来兼容 AoT。为了遵守 SO,我无耻地复制了来自

    的解决方案

    https://github.com/ngrx/platform/issues/306

    app.module.ts

    import { BrowserModule } from '@angular/platform-browser'
    import { NgModule } from '@angular/core'
    import { StoreModule } from '@ngrx/store'
    
    import { AppRoutingModule } from './app-routing.module'
    import { AppComponent } from './app.component'
    import { reducers, reducerToken, reducerProvider } from './reducers';
    
    @NgModule({
      declarations: [
        AppComponent
      ],
      imports: [
        BrowserModule,
        AppRoutingModule,
        StoreModule.forRoot(reducerToken),
      ],
      providers: [reducerProvider],
      bootstrap: [ AppComponent ]
    })
    export class AppModule { }
    

    reducers.ts:

    import { ActionReducerMap, combineReducers } from '@ngrx/store'
    
    import * as fromApp from './appReducers'
    import * as fromNested from './nestedReducers'
    import { InjectionToken } from '@angular/core';
    
    export interface IState {
        app: {
            a: fromApp.IState,
            b: fromNested.IState,
        }
    }
    
    export const reducers = combineReducers({
        a: fromApp.reducer,
        b: fromNested.reducer,
    });
    
    export const reducerToken = new InjectionToken<ActionReducerMap<IState>>('Reducers');
    
    export function getReducers() {
        return {
          app: reducers,
        };
    }
    
    export const reducerProvider = [
        { provide: reducerToken, useFactory: getReducers }
    ];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-28
      • 2017-09-20
      • 2018-02-04
      • 2017-07-14
      • 2018-06-11
      • 2017-03-30
      • 1970-01-01
      相关资源
      最近更新 更多