[英]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.