不支持 Typescript 2.1.5 函数调用

Posted

技术标签:

【中文标题】不支持 Typescript 2.1.5 函数调用【英文标题】:Typescript 2.1.5 Function calls are not supported 【发布时间】: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)] 【参考方案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 
];

【讨论】:

以上是关于不支持 Typescript 2.1.5 函数调用的主要内容,如果未能解决你的问题,请参考以下文章

Typescript派生类和抽象类

Typescript - 泛型

如何在 Angular 5 中从 Typescript 调用 JavaScript 函数?

TypeScript泛型

选择Typescript的原因:支持定义执行时的泛型参数

Typescript/Angular - 模态结果返回后调用单独的函数