2016-02-27 43 views
0

几天前,我找到了一种TypeScript语言。根据视频评论,它看起来很有希望,因为它给JavaScript带来了适当的代码完成,隐含的代码文档,并且可能使它更安全。是否可以使用构造函数作为TypeScript中另一个函数的参数类型?

我想在TypeScript中重写一个简单的AngularJS应用程序。我想指定注入控制器的参数类型。让我们假设下面的JS代码:

// service.js 
angular.module('app').service('MyService', MyService); 
function MyService() { 
    this.test = function test() { console.log('test'); }; 
} 

// controller.js 
angular.module('app').controller('MyController', MyController); 
function MyController($scope, MyService) { 
    $scope.test = function test() { MyService.test(); }; 
} 

我想实现这样的事情:

// controller.ts 
angular.module('app').controller('MyController', MyController); 
function MyController($scope, MyService:MyService) { 
    // ... 
} 

所以它会更容易编写与代码完成的MyService参数控制器的代码。但是,此代码使编译器发出error TS2304: Cannot find name 'MyService'

我已经尝试了一些东西,发现至少有两种可能的解决方案。但是,它们并不是理想的。

1)创建一个额外的接口,该接口声明服务的所有方法。但是这种方法需要大量额外的键入(实际上,我们定义了两次完全签名的同一组方法,并且在更改的情况下还必须更新几个方法)。接口多次实现时,这种方式完全可以,但对于单个AngularJS服务看起来是多余的。

2)构造函数可以用类替换。这样可以使用类的名称作为参数的类型。然而,这也导致了两个问题:

  • 打字稿编译转换类定义为被分配到与var关键字(至少,处理ES5)声明的变量关闭。这需要AngularJS服务声明放在文件最底部的类定义之后。它增加了忘记做这件事的可能性。

    angular.module('app').service('MyService', MyService); 
    class MyService { 
        test() { console.log('test'); } 
    } 
    
    // becomes 
    
    angular.module('app').service('MyService', MyService); 
    var MyService = (function() { 
        function MyService() { 
        } 
        MyService.prototype.test = function() { console.log('test'); }; 
        return MyService; 
    }()); 
    
  • 要这样做,我们必须注入依赖关系到服务的构造函数。因此,每次使用依赖关系时,都需要指定多余的this.字符串。

那么,有没有其他的方法来传递构造函数作为另一个函数的参数类型?谢谢。

P.S .:我不知道是否有必要,但我使用了Sublime Text 3和一个官方的TypeScipt插件和gulp-typescript进行编译。

回答

1

是的,你可以这样做。见working CodePen

class MyController 
{ 
    static $inject = ['MyService','$scope']; 

    constructor(private myService:MyService, private $scope:any){ 
    this.$scope.test = this.myService.test; 
    } 
} 

class MyService{ 
    test(){ 
    console.log('test'); 
    } 
} 
+0

谢谢,@ rwisch45。你已经证明了我的假设,即实现这个的唯一“正常”方法是使用类。你知道如何处理我在这个问题中提到的这种方法的缺点吗? – DWand

相关问题