Ich möchte eine Schnittstelle mit einer schreibgeschützten Eigenschaft definieren. Zum Beispiel;
interface foo {
get bar():bool;
}
Dies gibt jedoch den Syntaxfehler "erwartet ';'" in der Leiste an. Ich habe mein VisualStudio so eingerichtet, dass es das ES5-Ziel verwendet, sodass Getter unterstützt werden. Ist dies eine Einschränkung der Schnittstellen? Könnte diese Änderung in der Zukunft sein; Es ist eine sehr schöne Sache, das tun zu können.
typescript
Ezward
quelle
quelle
Antworten:
Nur-Getter-Eigenschaften wurden in Typescript 2.0 eingeführt :
quelle
bar
als Eigentum, nicht als Getter.Error TS2540 (TS) Cannot assign to 'bar' because it is a constant or a read-only property.
Ja, dies ist eine Einschränkung der Schnittstellen. Ob der Zugriff auf die Eigenschaft mit einem Getter implementiert wird oder nicht, ist ein Implementierungsdetail und sollte daher nicht Teil der öffentlichen Schnittstelle sein. Siehe auch diese Frage .
Wenn Sie ein schreibgeschütztes Attribut benötigen, das in einer Schnittstelle angegeben ist, können Sie eine Getter-Methode hinzufügen:
quelle
Wie @Vitaliy Ulantikov antwortete, können Sie den
readonly
Modifikator für eine Eigenschaft verwenden. Dies verhält sich genau wie ein Getter.Wenn ein Objektliteral die Schnittstelle implementiert, können Sie eine
readonly
Eigenschaft nicht überschreiben :let p1: Point = { x: 10, y: 20 }; p1.x = 5; // error!
Wenn eine Klasse die Schnittstelle implementiert, kann das Überschreiben nicht vermieden werden.
class PointClassBroken implements Point { // these are required in order to implement correctly x: number; y: number; constructor(x: number, y: number) { this.x = x this.y = y } changeCoordinates(x: number, y: number): void { this.x = x // no error! this.y = y // no error! } }
Ich denke, das liegt daran, dass beim erneuten Deklarieren von Eigenschaften in der Klassendefinition diese die Eigenschaften der Schnittstelle überschreiben und nicht mehr schreibgeschützt sind.
Um dies zu beheben, verwenden Sie
readonly
die Eigenschaften direkt in der Klasse, die die Schnittstelle implementiertclass PointClassFixed implements Point { readonly x: number; readonly y: number; constructor(x: number, y: number) { this.x = x this.y = y } changeCoordinates(x: number, y: number): void { this.x = x // error! this.y = y // error! } }
Überzeugen Sie sich selbst auf dem Spielplatz .
quelle