Сначала немного предыстории того, чего я хочу достичь. У меня есть служба, которая требует некоторой настройки, прежде чем она будет внедрена и использована. Проведя некоторое исследование, я решил, что лучшим решением будет наличие поставщика услуг. Поэтому я реализовал провайдера в соответствии с этим примером. . Даже несмотря на то, что компилятор 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 не является функцией в контексте.[анонимно]
Также скомпилированный код JavaScript Visual Studio дает мне зеленое предупреждение (я не думаю, что это ошибка) в переменной провайдера в строке .provider('CustomService', CustomServiceProvider);
Аргумент типа '() => void' нельзя присвоить параметру типа 'IServiceProvider'. Свойство '$get' отсутствует в типе '() => void'.
(local var) CustomServiceProvider: () => void
Providers
Я уже потратил часы на исправление этой проблемы, но не могу найти решение. Любая идея о том, как исправить это, что я делаю неправильно?
Заранее спасибо.
Изменить (30 сентября 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
}
}