2012-12-16 43 views
34

Olası Çoğalt:
How does prototype extend on typescript?genişletme işlevselliği

Şu anda typescript öğreniyorum ve mevcut nesnelere işlevsellik eklemek için nasıl mümkün olduğunu bilmek istiyorum. Dize nesnesine Foo için bir uygulama eklemek istediğimi varsayalım. JavaScript'inizde bunu yapabilirmiydim:

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

o typescript sınıflar, arayüzler ve modüller anlamak açık uçlu olan aşağıdakileri deneyin götürdü, başarı olmadan

1. Referans JavaScript uygulaması

typescript dan
JavaScript: 

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

    TypeScript: 

    var x = "Hello World"; 
    x.Foo(); //ERROR, Method does not exist 

2. arayüzü

uzatma 0
interface String { 
    Foo(): number; 
} 

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

3. nasıl, sınıf

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

// ERROR: Duplicate identifier 'String' 

Şu ana kadar ben bir arayüz sözleşme yoluyla yöntemi eklemek mümkün olmuştur, bu sonuçlardan da görebileceğiniz gibi, ancak hiçbir uygulama uzatın, bu yüzden Önceden varolan String sınıfının bir parçası olarak Foo yöntemimi tanımlamak ve uygulamaktan bahsediyorum?

cevap

48

Çözümü buldum. Arayüz ve JavaScript uygulamasının bir kombinasyonunu gerektirir. Arayüz, yeni yöntemin görünürlüğünü sağlayan TypeScript için sözleşme sağlar. JavaScript uygulaması, yöntem çağrıldığında yürütülecek kodu sağlar.

Örnek:

interface String { 
    foo(): number; 
} 

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

typescript 1.4 itibariyle artık statik üyeleri uzatabilir:

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

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

Kesinlikle, o olması gerekiyordu nasıl. Unutmayın, TypeScript kendi içinde bir dil değildir, sadece sözdizimsel bir şekerdir. Yani 'JavaScript stilinde' bir şeyler yazmak, herhangi bir dezavantajı olmayan iyi bir uygulamadır. –

+1

Bu çözüm gerçekten ** String ** ile çalışıyor mu? Çünkü _exact_ aynı şeyi yapıyorum ve özellik String türünde mevcut değil derleme hataları alıyorum. Neyi kaçırıyorum? (tsc 1.4.1 kullanarak) – sebas2day

+0

@ sebas2day evet işe yarar - http://tinyurl.com/ouwh3ln – series0ne