不支持 Typescript 2.1.5 函数调用
Typescript 2.1.5 Function calls are not supported
我有以下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;
}
};
运行 应用程序出现以下错误:
ERROR in Error encountered resolving symbol values statically.
Function calls are not s upported. Consider replacing the function or
lambda with a reference to an exported fun ction (position 40:50 in
the original .ts file), resolving symbol raceReducer in J:/wor
kspace/angular2/ts/epimss/src/app/registration/race/race.ngrx-store.ts,
resolving symbo l AppModule in
J:/workspace/angular2/ts/epimss/src/app/app.module.ts, resolving
symbol AppModule in
J:/workspace/angular2/ts/epimss/src/app/app.module.ts, resolving
symbol Ap pModule in
J:/workspace/angular2/ts/epimss/src/app/app.module.ts
引用的函数是
( state: IRace = new Race(), action?: Action )
这是为什么,解决方法是什么。我认为这应该是合法的 typescript2.1.5 代码,但似乎不是这样。
谢谢
AoT 需要静态分析一些代码,无法分析函数调用。
有关 AoT 限制的更多详细信息,请参阅 https://github.com/qdouble/angular-webpack2-starter#aot--donts
有关讨论,请参阅此问题 https://github.com/angular/angular/issues/11262
这似乎很重要,至于 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 }
];
我有以下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;
}
};
运行 应用程序出现以下错误:
ERROR in Error encountered resolving symbol values statically. Function calls are not s upported. Consider replacing the function or lambda with a reference to an exported fun ction (position 40:50 in the original .ts file), resolving symbol raceReducer in J:/wor kspace/angular2/ts/epimss/src/app/registration/race/race.ngrx-store.ts, resolving symbo l AppModule in J:/workspace/angular2/ts/epimss/src/app/app.module.ts, resolving symbol AppModule in J:/workspace/angular2/ts/epimss/src/app/app.module.ts, resolving symbol Ap pModule in J:/workspace/angular2/ts/epimss/src/app/app.module.ts
引用的函数是
( state: IRace = new Race(), action?: Action )
这是为什么,解决方法是什么。我认为这应该是合法的 typescript2.1.5 代码,但似乎不是这样。
谢谢
AoT 需要静态分析一些代码,无法分析函数调用。
有关 AoT 限制的更多详细信息,请参阅 https://github.com/qdouble/angular-webpack2-starter#aot--donts
有关讨论,请参阅此问题 https://github.com/angular/angular/issues/11262
这似乎很重要,至于 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 }
];