Angularjs 将依赖项注入Typescript中的静态工厂

Angularjs 将依赖项注入Typescript中的静态工厂,angularjs,service,dependency-injection,typescript,factory,Angularjs,Service,Dependency Injection,Typescript,Factory,我有一个用typescript作为类编写的服务。在这个类中,我定义了一个静态工厂,我注入依赖项 当我压缩我的应用程序时,依赖项被压缩,我收到一个未定义的提供程序错误 这是我的服务: export class TInterceptor { public static $inject = ['$q', '$rootScope']; public static Factory($q:ng.IQService, $rootScope:ng.IRootScopeService) { retur

我有一个用typescript作为类编写的服务。在这个类中,我定义了一个静态工厂,我注入依赖项

当我压缩我的应用程序时,依赖项被压缩,我收到一个未定义的提供程序错误

这是我的服务:

export class TInterceptor {    
public static $inject = ['$q', '$rootScope'];
public static Factory($q:ng.IQService, $rootScope:ng.IRootScopeService)
{
  return new TInterceptor($q, $rootScope);
}
constructor(private $q:ng.IQService, private $rootScope:ng.IRootScopeService){}...}
此处调用的服务:

  angular
    .module('t')
    .config(config);

  function config($httpProvider:ng.IHttpProvider)
  {
    $httpProvider.interceptors.push(TInterceptor.Factory);
  }

我的问题是,如何确保在压缩代码时不覆盖依赖项?

您有两种不同的选择:

1) 在config函数中定义它

function config(){...}
config.$inject = ['$httpProvider'];
2) 定义将函数添加到模块的时间

angular
  .module('t')
  .config(['$httpProvider', config]);

注册工厂。i、 e

angular.module('myapp').factory('interceptorFactory', ['$q','$rootScope',TInterceptor.Factory]);
并在配置块中提供工厂名称:

$httpProvider.interceptors.push('interceptorFactory');
或者也提供数组(猜测它应该和内部使用
$injector.invoke
它不是字符串一样工作)

您还忘记了
config
块上的显式注释

.config(['$httpProvider', config]);
编辑:Typescript 1.6的更新 既然Typescript 1.6已经推出,在支持类表达式的情况下,您可以直接使用带有闭包的类表达式来使用注入:

angular.module('myApp')
    .factory('MyFactory', function($q, $http) {

        return class {

            constructor(data) {
                // Here you have access to $q and $http
            }
        }
    })

打字稿1.5 Typescript目前不允许类表达式,直到版本1.6,我个人现在使用以下语法:

class MyClass {

    constructor(
        private $q: ng.IQService,
        private $http: ng.IHttpService
        data) {

    }
}
然后,我使用标准的Angular factory定义,该定义允许在构建期间使用ng annotate,并在返回类之前使用factory注入对类进行验证:

angular.module('myApp')
    .factory('MyFactory', function($q, $http) {

        var factory = MyClass

        // Return curried MyClass
        return Function.prototype.bind.apply(factory,
            Array.prototype.concat.apply([factory], arguments))
    });
回流管相当于:

return MyClass.bind(MyClass, $q, $http)
它的可读性较差,但会阻止您在每次更改依赖项时编写两次依赖项

或者,如果您有Lodash或下划线,您可以使用更优雅的方式:

return _.curry(MyClass).apply(this, arguments)
然后,我只能通过提供基本数据来实例化我的类:

new MyFactory(data)
new MyFactory(data)