2

我正在像这样构建我的 angular2 服务

import { OpaqueToken, ClassProvider } from "@angular/core";

export interface IService {
  // ... interface declaration
}

export class Service implements IService {
  // ... implementation goes here
}

export const IService = new OpaqueToken(Service.name);

export const ServiceProvider: ClassProvider = {
    provide: IService,
    useClass: Service,
};

使用 ngc 和 angular 2.xx 可以很好地工作和编译但是在升级到 angular 4.xx 后,在组件“提供者”数组中使用时,ServiceProvider 不能再进行 ngc 编译。(有趣的是,当提供程序注册在 ngModule 中而不是在组件中时,整个事情都有效。)

我在控制台上得到以下信息:

events.js:160 抛出 er;// 未处理的“错误”事件 ^ 错误:命令失败:npm run ngc 错误:内部错误:未知标识符 {}

有什么想法吗?我可能会将我的服务转换为 @Injectable() 并且不使用该接口,但这似乎与使用服务接口的整个想法背道而驰:(

仅供参考:我正在使用 TypeScript 2.2.2

非常感谢你的帮助!

4

2 回答 2

1

https://angular.io/docs/ts/latest/api/core/index/OpaqueToken-class.html

OpaqueToken 在 4.x 中已被弃用,也许可以尝试使用 InjectionToken 代替。

这是首先想到的。

于 2017-05-08T17:11:31.380 回答
1

不幸的是,用 InjectionToken 替换 OpaqueToken 并没有解决问题。然而,所做的是使用抽象类而不是接口注入令牌

根据这个答案Angular 2 Injectable Interface? 注入抽象类并像接口一样使用它们是一个常见的方法(也被 Angular 团队自己使用)。

import { ClassProvider } from "@angular/core";

export abstract class IService {
  // ... interface declaration
}

export class Service implements IService {
  // ... implementation goes here
}

export const ServiceProvider: ClassProvider = {
    provide: IService,
    useClass: Service,
};

于 2017-05-09T14:46:25.770 回答