繁体   English   中英

是否可以将构造函数用作TypeScript中另一个函数的参数类型?

[英]Is it possible to use a constructor function as a type of an argument of another function in TypeScript?

几天前,我发现了一种TypeScript语言。 根据视频评论,对我来说,它看起来非常有前途,因为它为JavaScript带来了适当的代码完成,隐式代码文档,并且可能使它更加类型安全。

我正在尝试用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)构造函数可以用一个类代替。 这样,可以将类的名称用作参数的类型。 但是,这也导致了两个问题:

  • typescript编译器将类定义转换为闭包,这些闭包分配给使用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. 每次使用依赖项时都为字符串。

那么,还有其他方法可以将构造函数作为另一个函数的参数类型传递吗? 谢谢。

PS:我不知道是否有必要,但是我将Sublime Text 3与官方的TypeScipt插件和gulp-typescript一起使用进行编译。

是的,您可以这样做。 查看工作的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');
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM