首先是我想要实现的一点背景。我有一项服务需要在注入和使用之前进行一些配置。在做了一些研究之后,我认为拥有该服务的提供商将是最好的解决方案。所以我根据这个例子实现了提供者。即使 Typescript 编译器(我正在使用 typescript 将我的代码编译成有效的 JavaScript)认为没问题,JavaScript 也无法识别可通过提供程序设置某些选项的函数。
我的代码如下所示(某些代码因某种原因被遗漏或重命名)
export interface ICustomServiceProvider extends ng.IServiceProvider {
setOptions(options: ICustomOptions): void;
$get($http, $window, $resource): ICustomService;
}
class CustomServiceProvider implements ICustomServiceProvider {
private options: ICustomOptions;
public $get($http, $window, $resource) {
return new CustomService($http, $window, $resource);
}
public setOptions(options: ICustomOptions): void {
this.options = options;
}
}
angular.module('custom', ['ngResource'])
.service('CustomService', CustomService)
.provider('CustomService', CustomServiceProvider);
在我的一个单元测试中使用提供程序(我使用 Karma 和 Mocka 进行测试)并调用该setOptions
函数时会出现问题。像这样完成的。
describe('CustomService', function() {
var provider: ICustomServiceProvider;
var options: {hello: 'world'};
beforeEach(inject(function($injector: ng.auto.IInjectorService) {
provider = <ICustomServiceProvider> $injector.get('');
}));
it('CustomService provider test', function() {
provider.setOptions(options);
});
}
运行此测试时,Karma 会抛出错误消息
TypeError:provider.setOptions 不是 Context 中的函数。[匿名]
此外,已编译的 JavaScript Visual Studio 代码在线上的提供程序变量上给了我一个绿色警告(我不认为这是一个错误).provider('CustomService', CustomServiceProvider);
'() => void' 类型的参数不能分配给'IServiceProvider' 类型的参数。类型“() => void”中缺少属性“$get”。
(local var) CustomServiceProvider: () => void
Providers
我已经花了几个小时来解决这个问题,但似乎找不到解决方案。关于如何解决我做错了什么的任何想法?
提前致谢。
编辑 (30-09-2015)
我正在谈论的服务如下所示:
export interface ICustomService {
// Some function definitions
}
class CustomService implements ICustomService {
static $inject = ['$http', '$window', '$resource'];
constructor(httpService: ng.IHttpService, windowService: ng.IWindowService, resourceService: ng.resource.IResourceService, options: ICustomOptions) {
// Setting variables
}
}