2012-10-11 45 views
3

我想要做的事與thisthis非常相似,除了我試圖弄清楚如何在模塊中放置ArrayExtension。模塊中的TypeScript擴展對象

我想獲得類似於C#擴展方法的工作方式,這種方式我可以導入模塊,我會有我的額外方法。我提供的鏈接顯示瞭如何擴展現有的對象,但我一直無法弄清楚如何將其封裝到模塊中。

回答

0

如果您嘗試擴展內置的數組類型,則無法在模塊內執行此操作。你的擴展需要存在於ArrayEx.ts文件中,並且發生在任何模塊之外。原因是,如果你在一個模塊中做了這個,你會擴展Foo.Array類型,這與Array不一樣。

但你說你只是想導入模塊,讓你的額外方法出現,你真正需要做的就是將/// <reference path='ArrayEx.ts' />添加到你想要擴展方法可用的任何文件。這本質上是一回事。

+0

這編譯,但ArrayEx.js腳本不會自動導入requirejs。有沒有辦法讓這種情況發生,或者我必須直接鏈接到我的HTML文件中的文件? – PrettyFlower

1

如果你的目標是像node.js這樣的非瀏覽器環境,那麼這將是可能的,因爲你將能夠將對你模塊的全局成員(如Array)的引用傳遞給其他模塊。那些其他模塊可以擴展傳入的對象和/或其原型的額外功能,這些功能只能由調用模塊訪問。其他模塊也必須這樣做才能獲得這些擴展;因此,由於進口是明確的,因此衝突最小化。

但是,在瀏覽器環境中,情況並非如此,因爲只有一個window對象,並且其成員的任何更改都可用。只要您的任何模塊擴展Array這些擴展將可用於所有其他模塊 - 增加了衝突的可能性並使代碼難以推理。

這樣說,JS中有模式,因此TypeScript,它應該完成你想要的。一種這樣的模式是'mixin'模式,它允許您在對象實例的基礎上添加額外的功能。您可以將可重用的代碼分離爲混合模塊,然後可以在需要時將其應用於對象,甚至可以在構造函數中自動應用。看看這個有一個體面的概述和實現示例:http://javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins/