簡體   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