Ist es möglich, Getter / Setter in Typoskript Schnittstellen zu benutzen?

stimmen
29

Ich mag eine Schnittstelle mit einer Nur-Lese-Eigenschaft definieren. Zum Beispiel;

interface foo {
    get bar():bool;
}

Doch dies gibt die Syntaxfehler, „erwartet‚‘“ auf bar. Ich habe mein Setup Visual Studio das ES5 Ziel zu verwenden, so Getter unterstützt werden. Ist dies eine Einschränkung der Schnittstellen? Might diese Änderung in der Zukunft; es ist eine sehr schöne Sache tun zu können.

Veröffentlicht am 11/10/2012 um 18:08
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
31

Getter-only Eigenschaften wurden in eingeführt Typoskript 2.0 :

interface foo {
    readonly bar: boolean;
}
Beantwortet am 13/04/2017 um 11:09
quelle vom benutzer

stimmen
17

Ja, das ist eine Einschränkung von Schnittstellen. Unabhängig davon , ob der Zugriff auf die Eigenschaft mit einem Getter umgesetzt wird , ist eine Implementierung Detail und somit nicht Teil der öffentlichen Schnittstelle sein sollte. Siehe auch diese Frage .

Wenn Sie ein Nur-Lese-Attribut angegeben in einer Schnittstelle benötigen, können Sie eine Getter-Methode hinzu:

interface foo {
    getAttribute() : string;
}
Beantwortet am 11/10/2012 um 19:16
quelle vom benutzer

stimmen
0

Als @Vitaliy Ulantikov beantwortet, können Sie das verwenden readonlyModifikator auf einem Grundstück. Dies wirkt genau wie ein Getter.

interface Point {
    readonly x: number;
    readonly y: number;
}

Wenn ein Objektliteral die Schnittstelle implementiert, können Sie eine nicht überschreiben readonlyEigenschaft:

let p1: Point = { x: 10, y: 20 };
p1.x = 5; // error!

Aber wenn eine Klasse die Schnittstelle implementiert, gibt es keine Möglichkeit , es zu überschreiben zu vermeiden.

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 ist, weil, wenn Sie Eigenschaften in der Klassendefinition neu erklären, sie die Eigenschaften der Schnittstelle zu überschreiben, und nicht mehr nur lesbar.

Um das zu beheben, verwenden Sie readonlydie Eigenschaften direkt in der Klasse , die die Schnittstelle implementiert

class 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 in den Spielplatz .

Beantwortet am 14/09/2018 um 05:03
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more