不支持 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 函数调用的主要内容,如果未能解决你的问题,请参考以下文章