2014-05-18 61 views
0

我一直在使用TypeScript與Angular半年。當我需要的東西添加到$範圍,我按照定義這樣的接口的恕我直言最佳實踐:TypeScript - 將新屬性添加到類型化對象而不聲明新界面的最佳語法?

interface IMyScope extends ng.ISCope { 
    myAddedProp:string; 
} 

... 

link:($scope:IMyScope){ 
    $scope.myAddedProp = "foo"; 
} 

不過,有時候它仍然是方便的屬性添加到$範圍對飛(主要是當我進行原型設計時)。對於這些情況,我通常做這樣的事情:

link:($scope:IScope){ 

    (<any>$scope).myAddedProp = "foo"; 

    //or 
    $scope["myAddedProp"] = "foo"; 

    //If I have to add many props, I use this: 
    var $scopeA: any = $scope; 
    $scopeA.myAddedProp1 = "foo"; 
    $scopeA.myAddedProp2 = "bar"; 
    $scopeA.myAddedProp3 = "baz"; 
} 

我也有在和的NodeJS其他圖書館這個問題 - 當你只需要添加一些屬性,不希望與接口打擾。

SO搜索提供了所有這些選項,但是沒有更好的方法來實現它嗎?類似於

$scope*.newProp = "foo"; 

+0

你可以做'$範圍[「myAddedProp」] =「富」;' – WiredPrairie

+3

你已經涵蓋了所有的基本上可用的選項。 –

回答

1

如果你把一個類的範圍:

interface IMyScope extends ng.ISCope { 
    vm:SomeClass; 
} 

link:($scope:IMyScope){ 

    scope.vm = new SomeClass(); 
} 

然後,你可以到SomeClass添加新的特性,而無需手動維護的接口。

更好地使用指令中的controller選項爲您設置一個類。

0

您可以使用一個通用的範圍,以獲得VM強類型到控制器:

interface IScope<T> extends angular.IScope { 
    vm: T; 
} 

class MyController { 

    private vm: MyViewModel; 

    static $inject = ['$scope']; 
    constructor(scope: IScope<MyViewModel>) { 

     super(); 

     this.vm = new MyViewModel(); 

     scope.vm = this.vm; 
    } 
}