2012-12-16 33 views
34

可能重複:
How does prototype extend on typescript?在打字稿擴展功能

目前我正在學習打字稿,並想知道它是如何可能將功能添加到現有的對象。假設我想爲Foo添加一個實現到String對象。從打字稿

String.prototype.Foo = function() { 
    // DO THIS... 
} 

應該理解的是打字稿類,接口和模塊是開放式的使我嘗試以下,沒有成功

1.參考JavaScript實現:在JavaScript中,我會做這個

JavaScript: String.prototype.Foo = function() { // DO THIS... } TypeScript: var x = "Hello World"; x.Foo(); //ERROR, Method does not exist 

2.擴展接口

interface String { 
    Foo(): number; 
} 

var x = "Hello World"; 
x.Foo(); //Exists but no implementation. 

3.擴展類

class String { 
    Foo(): number { 
     return 0; 
    } 
} 

// ERROR: Duplicate identifier 'String' 

正如你可以從這些結果中看到,到目前爲止,我已經能夠通過一個接口協議來添加方法,但沒有實現,所以,怎麼辦我將定義和實現我的Foo方法作爲預先存在的String類的一部分?

回答

48

我找到了解決方案。它需要接口和JavaScript實現的組合。該界面提供了TypeScript的契約,可以看到新方法。 JavaScript實現提供了在調用方法時將執行的代碼。

例子:

interface String { 
    foo(): number; 
} 

String.prototype.foo= function() { 
    return 0; 
} 

作爲打字稿1.4現在還可以延長靜態成員:

interface StringConstructor { 
    bar(msg: string): void; 
} 

String.bar = function(msg: string) { 
    console.log("Example of static extension: " + msg); 
} 
+2

沒錯,這就是它是如何命中註定的。請記住,TypeScript本身不是一種語言,它只是一個語法糖。所以用'JavaScript風格'寫一些東西是一個很好的做法,沒有任何缺點。 –

+1

這個解決方案是否真的與** String **一起工作?因爲我正在做與_exact_相同的事情並且得到編譯錯誤,該屬性在String類型中不存在。我錯過了什麼? (TSC使用1.4.1) – sebas2day

+0

@ sebas2day是它的工作原理 - http://tinyurl.com/ouwh3ln – series0ne