0

最初に、私が達成したいことの背景を少し説明します。挿入して使用する前に、いくつかの構成が必要なサービスがあります。いくつかの調査を行った後、サービスのプロバイダーを持つことが最善の解決策になると考えました. そこで、この例に従ってプロバイダーを実装しました。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);

この問題は、単体テストの 1 つでプロバイダーを使用し (テスト用に Mocka と共に Karma を使用しています)、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);
  });
}

このテストを実行すると、カルマは次のエラーをスローします

TypeError: provider.setOptions は Context.[anonymous] の関数ではありません

また、コンパイルされた JavaScript Visual Studio Code は、行のプロバイダー変数に緑色の警告を表示しています (エラーではないと思います)。.provider('CustomService', CustomServiceProvider);

タイプ '() => void' の引数は、タイプ 'IServiceProvider' のパラメーターに割り当てられません。プロパティ '$get' がタイプ '() => void' にありません。
(ローカル変数) CustomServiceProvider: () => 無効な
プロバイダー

この問題の修正にすでに何時間も費やしましたが、解決策が見つからないようです。私が間違っていることを修正する方法について何か考えはありますか?

前もって感謝します。

編集 (2015 年 9 月 30 日)

私が話しているサービスは次のようになります。

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
  }
}
4

1 に答える 1