Je možné použít metody pro čtení / setters na stroji rozhraní?

hlasů
29

Chtěl bych definovat rozhraní s vlastnost ReadOnly. Například;

interface foo {
    get bar():bool;
}

Nicméně, toto dává syntaktická chyba, „očekává‚‘“ na baru. Mám Setup my VisualStudio používat cíl ES5, takže jsou podporovány getry. Je to o omezení rozhraní? Možná tato změna v budoucnosti; Je to velmi pěkná věc, aby mohli dělat.

Položena 11/10/2012 v 18:08
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
31

Getter vlastnosti jen byly zavedeny v psacím stroji 2.0 :

interface foo {
    readonly bar: boolean;
}
Odpovězeno 13/04/2017 v 11:09
zdroj uživatelem

hlasů
17

Ano, jedná se o omezení rozhraní. Zda je či není přístup k nemovitosti je realizován s kariérista je implementační detail, a proto by neměly být součástí veřejného rozhraní. Viz také tuto otázku .

Pokud potřebujete jen pro čtení atribut zadaný v rozhraní, můžete přidat metodu getter:

interface foo {
    getAttribute() : string;
}
Odpovězeno 11/10/2012 v 19:16
zdroj uživatelem

hlasů
0

Jako odpověděl @Vitaliy Ulantikov, můžete použít readonlymodifikátor na majetku. Toto se chová přesně jako kariérista.

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

Když objekt doslovný implementuje rozhraní, nelze přepsat readonlyvlastnost:

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

Ale když třída implementuje rozhraní, není tam žádný způsob, jak zabránit přepsání.

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!
    }
}

Myslím, že je to proto, že když znovu deklarovat vlastnosti v definici třídy, které potlačí vlastnosti rozhraní, a již nejsou jen pro čtení.

Chcete-li, že pouze readonlyna vlastnostech přímo ve třídě, která implementuje rozhraní

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!
    }
}

Podívejte se sami na hřišti .

Odpovězeno 14/09/2018 v 05:03
zdroj uživatelem

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