2012-12-16 11 views
34

Mögliche Duplizieren:
How does prototype extend on typescript?Erweiterung der Funktionalität in Typoskript

Ich bin derzeit Lernen Typoskript, und würde gerne wissen, wie es möglich ist, Funktionalität vorhandener Objekte hinzuzufügen. Angenommen, ich möchte dem String-Objekt eine Implementierung für Foo hinzufügen. In JavaScript würde ich dies tun:

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

dass Typoskript Klassen, Schnittstellen und Module zu verstehen sind offen beendet mich dazu gebracht, die folgende, um zu versuchen, ohne Erfolg

1. Referenz die JavaScript-Implementierung von Typoskript

JavaScript: 

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

    TypeScript: 

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

2. Erweitern Sie die Schnittstelle

interface String { 
    Foo(): number; 
} 

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

3. Erweitern Sie die Klasse

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

// ERROR: Duplicate identifier 'String' 

Wie Sie aus diesen Ergebnissen sehen kann, so weit ich habe die Methode über eine Schnittstelle Vertrag, aber keine Implementierung, so, in der Lage zu hinzufügen Wie Ich definiere und implementiere meine Foo-Methode als Teil der bestehenden String-Klasse?

Antwort

48

Ich habe die Lösung gefunden. Es benötigt eine Kombination aus der Schnittstelle und der JavaScript-Implementierung. Die Schnittstelle stellt den Vertrag für TypeScript bereit, mit dem die neue Methode sichtbar gemacht werden kann. Die JavaScript-Implementierung stellt den Code bereit, der beim Aufruf der Methode ausgeführt wird.

Beispiel:

interface String { 
    foo(): number; 
} 

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

Ab Typoskript 1.4 können Sie jetzt auch statische Elemente erweitern:

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

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

Genau, das ist, wie es gemeint ist, zu sein. Denken Sie daran, TypeScript ist keine Sprache für sich, es ist nur ein syntaktischer Zucker. So etwas im "JavaScript-Stil" zu schreiben ist eine gute Übung, die keinerlei Nachteile hat. –

+1

Funktioniert diese Lösung wirklich mit ** String **? Weil ich _exact_ dasselbe mache und Kompilierungsfehler erhalte, dass die Eigenschaft nicht im String-Typ existiert. Was vermisse ich? (mit tsc 1.4.1) – sebas2day

+0

@ sebas2day ja es funktioniert - http://tinyurl.com/ouwh3ln – series0ne

Verwandte Themen