Angular - useFactory - 不支持错误函数调用。考虑使用对导出函数的引用替换函数或 lambda

nes*_*est 5 angular-factory angular angular-compiler angular-aot

我使用 Angular AOT 编译器版本 4.1.3

我有一个组件库,它导出一个工厂方法,然后用于提供服务:

export function libServiceFactory(itemId: string) {
  return (http: Http): LibService => {
    return new LibService(http, itemId);
  };
};
Run Code Online (Sandbox Code Playgroud)

编译库ngc成功。

然后导入编译好的库,我LibServiceFactory在网站的 AppModule 中使用:

providers: [
  { provide: SERVICE_TOKEN, useFactory: libServiceFactory('foo'), deps: [Http] }
],
Run Code Online (Sandbox Code Playgroud)

编译网站ng build我收到以下错误:

ERROR in Error encountered resolving symbol values statically. Function calls are not supported. Consider replacing the function or lambda with a reference to an exported function (position 5:10 in the
original .ts file), resolving symbol libServiceFactory in C:/Projects/MyProject/code/MyWebsite/node_modules/@mylibrary/service.factory.d.ts, res
olving symbol AppModule in C:/Projects/MyProject/code/MyWebsite/src/app/app.module.ts, resolving symbol AppModule in C:/Projects/MyProject/code/MyWebsite/src/app/app.mod
ule.ts, resolving symbol AppModule in C:/Projects/MyProject/code/MyWebsite/src/app/app.module.ts
Run Code Online (Sandbox Code Playgroud)

错误(position 5:10 in the original .ts file)指向工厂方法中的匿名函数:return (http: Http): LibService => {

作为附加信息,我创建和使用工厂方法的方式与官方文档中关于注入令牌的建议相同。

我的错误是预期的行为吗?还是我的实现有问题?

Gau*_*eel 2

您无法在元数据装饰器(@Sth)内执行代码,因此您无权执行函数 libServiceFactory('foo')。

如果您想要一个工厂(例如一些服务注入来获取 HttpClient 服务),并同时给出一些 paramtersb('foo' 在您的情况下)。你必须使用以下技巧:

export const MyLibConfig = new InjectionToken<MyConfig>('MyLibConfig');

export interface MyConfig {
  p: number;
  msg: string;
}

export function serviceFactory(myConfig: MyConfig, http: HttpClient): MyService {
  const service = new MyService(http);
  service.myConfig = myConfig;
  return service;
}
Run Code Online (Sandbox Code Playgroud)

那么你可以使用:

      providers: [
        {
          provide: MyService,
          useFactory: serviceFactory,
          deps: [MyLibConfig, HttpClient]
        },
        {
          provide: MyLibConfig,
          useValue: {p:3, msg:'foo'}
        }
      ]
Run Code Online (Sandbox Code Playgroud)