Sie können die Eigenschaft auf der Schnittstelle angeben, aber Sie können nicht erzwingen, ob Getter und Setter wie folgt verwendet werden:
interfaceIExample{Name: string;}classExampleimplementsIExample{private _name: string ="Bob";publicgetName(){returnthis._name;}publicsetName(value){this._name = value;}}var example =newExample();
alert(example.Name);
In diesem Beispiel zwingt die Schnittstelle die Klasse nicht dazu, Getter und Setter zu verwenden. Ich hätte stattdessen eine Eigenschaft verwenden können (Beispiel unten) - aber die Schnittstelle soll diese Implementierungsdetails trotzdem verbergen, da dies ein Versprechen für den aufrufenden Code ist darüber, was es nennen kann.
interfaceIExample{Name: string;}classExampleimplementsIExample{// this satisfies the interface just the samepublicName: string ="Bob";}var example =newExample();
alert(example.Name);
Und schließlich =>ist dies für Klassenmethoden nicht zulässig. Sie können eine Diskussion über Codeplex beginnen, wenn Sie der Meinung sind, dass es einen brennenden Anwendungsfall dafür gibt. Hier ist ein Beispiel:
classTest{// Yes
getName =()=>'Steve';// No
getName()=>'Steve';// Noget name()=>'Steve';}
Sie können =>Klassenmethoden wie name = (a: string) => this._name;folgt definieren : In der Ausgabe JS wird sie jedoch innerhalb der Klassenfunktion definiert, anstatt das Prototypobjekt zu erweitern.
Orad
43
Um die anderen Antworten zu ergänzen, können Sie Folgendes verwenden, wenn Sie eine get valueauf einer Schnittstelle definieren möchten readonly:
Soweit mir bekannt ist und wie bereits erwähnt, gibt es derzeit keine Möglichkeit, eine Set-Only-Eigenschaft in der Schnittstelle zu definieren. Sie können die Beschränkung jedoch auf einen Laufzeitfehler verschieben (nur während des Entwicklungszyklus nützlich):
Zunächst einmal unterstützt Typescript getund setSyntax nur, wenn es auf Ecmascript 5 abzielt. Um dies zu erreichen, müssen Sie den Compiler mit aufrufen
tsc --target ES5
Schnittstellen unterstützen keine Getter und Setter. Um Ihren Code zum Kompilieren zu bringen, müssten Sie ihn in ändern
interface I {
getName():string;}class C implements I {
getName():string {returnnull;}}
Was Typoskript unterstützt, ist eine spezielle Syntax für Felder in Konstruktoren. In Ihrem Fall könnten Sie haben
interface I {
getName():string;}class C implements I {constructor(public name: string){}
getName():string {return name;}}
Beachten Sie, dass die Klasse Cdas Feld nicht angibt name. Es wird tatsächlich mit syntaktischem Zucker public name: stringim Konstruktor deklariert .
Wie Sohnee betont, soll die Schnittstelle tatsächlich alle Implementierungsdetails verbergen. In meinem Beispiel habe ich die Schnittstelle so ausgewählt, dass eine Getter-Methode im Java-Stil erforderlich ist. Sie können jedoch auch eine Eigenschaft festlegen und dann die Klasse entscheiden lassen, wie die Schnittstelle implementiert werden soll.
Sie können getund setSchlüsselwörter in TypeScript verwenden.
Fenton
Eine Randnotiz zur Unterstützung von ECMAScript 5 - Object.definePropertywird in IE8 +, FF4 +, Opera 12+, WebKit und Safari unterstützt. Es gibt auch eine EC5 Shim unter github.com/kriskowal/es5-shim
Fenton
-1
Verwenden von TypeScript 3.4:
interfaceIPart{
getQuantity(): number;}classPartimplementsIPart{private quantity: number;constructor(quantity: number){this.quantity = quantity;}public getQuantity =(): number =>{returnthis.quantity;};}let part =newPart(42);// When used in typescript, quantity is not accessible.// However, when compiled to javascript it will log '42'.
console.log(part.quantity);// Logs '42'.
console.log(part.getQuantity());
=>
Klassenmethoden wiename = (a: string) => this._name;
folgt definieren : In der Ausgabe JS wird sie jedoch innerhalb der Klassenfunktion definiert, anstatt das Prototypobjekt zu erweitern.Um die anderen Antworten zu ergänzen, können Sie Folgendes verwenden, wenn Sie eine
get value
auf einer Schnittstelle definieren möchtenreadonly
:Soweit mir bekannt ist und wie bereits erwähnt, gibt es derzeit keine Möglichkeit, eine Set-Only-Eigenschaft in der Schnittstelle zu definieren. Sie können die Beschränkung jedoch auf einen Laufzeitfehler verschieben (nur während des Entwicklungszyklus nützlich):
Nicht empfohlene Übung ; aber eine Option.
quelle
Zunächst einmal unterstützt Typescript
get
undset
Syntax nur, wenn es auf Ecmascript 5 abzielt. Um dies zu erreichen, müssen Sie den Compiler mit aufrufenSchnittstellen unterstützen keine Getter und Setter. Um Ihren Code zum Kompilieren zu bringen, müssten Sie ihn in ändern
Was Typoskript unterstützt, ist eine spezielle Syntax für Felder in Konstruktoren. In Ihrem Fall könnten Sie haben
Beachten Sie, dass die Klasse
C
das Feld nicht angibtname
. Es wird tatsächlich mit syntaktischem Zuckerpublic name: string
im Konstruktor deklariert .Wie Sohnee betont, soll die Schnittstelle tatsächlich alle Implementierungsdetails verbergen. In meinem Beispiel habe ich die Schnittstelle so ausgewählt, dass eine Getter-Methode im Java-Stil erforderlich ist. Sie können jedoch auch eine Eigenschaft festlegen und dann die Klasse entscheiden lassen, wie die Schnittstelle implementiert werden soll.
quelle
get
undset
Schlüsselwörter in TypeScript verwenden.Object.defineProperty
wird in IE8 +, FF4 +, Opera 12+, WebKit und Safari unterstützt. Es gibt auch eine EC5 Shim unter github.com/kriskowal/es5-shimVerwenden von TypeScript 3.4:
Siehe Beispiel auf TypeScript Playground .
quelle