2013-08-27 84 views
3

我有一些工具正在生成的TypeScript代碼。我想在另一個文件中擴展這個類。從0.9.1.1開始,最好的方法是什麼?在另一個文件中擴展一個類

我想也許我可以將我的附加功能固定在原型上,但是這給出了各種錯誤(根據編譯器的情緒而改變)。

例如:

Foo.ts(由工具生成)

module MyModule { 
    export class Dog { } 
} 

Bar.ts

module MyModule { 
    function bark(): string {return 'woof';} 

    Dog.prototype.bark = bark; 
} 
+1

我將你的問題解釋爲你想要的東西類似於C#中的部分類:單個類,但具有跨越多個文件的定義。一些屬性和方法將在一個文件中定義(文件由工具生成),一些屬性和方法將在另一個文件中定義,但它們是_same_類的成員,而不是子類。它是否正確?如果是這樣,我不相信在TypeScript中有什麼辦法可以做到這一點_precisely_(請參閱http://typescript.codeplex.com/workitem/933)。 – Peter

+0

您想要在基類的定義之外動態擴展基類。這似乎違背了TypeScript的精神,這是爲了強化JavaScript的輸入。你想要做的是慣用的JavaScript,但是TypeScript被髮明來避免*。允許類型*變形*有點違背強打字的原則... –

+0

可能的重複[如何將TypeScript類拆分爲多個文件?](http://stackoverflow.com/questions/23876782/how- do-i-split-a-typescript-class-into-multiple-files) – xmojmr

回答

1

不能在打字稿分割多個文件之間的類定義。然而打字稿瞭解JavaScript的是如何工作的,並讓你寫idomatic JavaScript類就好了:解決此

module MyModule { 
    export function Dog(){}; 
} 

module MyModule { 
    function bark(): string {return 'woof';} 
    Dog.prototype.bark = bark; 
} 

Try it online

一種方法是使用繼承:

class BigDog extends Dog{ 
    bark(){} 
} 
+1

我寧可不使用子類。這不是一個「是」的關係。這種解決方案在語言中沒有抽象類的情況下更成問題,因爲它沒有明確指出哪一個是「真正的」類。 – MgSam

+0

@MgSam TypeScript中現在有抽象類。 – Alex

0

我也遇到過你以前的問題,但我有一些更深層次的問題。你可以從basarat的例子中看到,簡單的函數可以作爲原型的擴展添加,但是當涉及到靜態函數或其他靜態值時,你可能想擴展你的(可能是第三方)類,那麼TSC會警告你,這個靜態類沒有定義這樣的方法。

我的解決方法是下面的小黑客:

module MyModule { 
    export function Dog(){}; 
} 

// in the other file 
if (typeof MyModule !== 'undefined'){ 
    Cast<any>(MyModule.Dog).Create =()=>{return new Dog();}; 
} 

// where Cast is a hack, for TS to forcefully cast types :) 
Cast<T>(element:any):T{ return element; } 

這應該投MyModule.Dog,到任何物體,因此允許任何種類的性質,功能的附件。

相關問題