Er det mulig å bruke getters / settere i Loggfila grensesnitt?

stemmer
30

Jeg ønsker å definere et grensesnitt med en skrivebeskyttet eiendom. For eksempel;

interface foo {
    get bar():bool;
}

Men dette gir syntaksfeil, forventet ';' på bar. Jeg har setup min Visual Studio til å bruke ES5 målet, så getters støttes. Er dette en begrensning av grensesnitt? Kanskje denne endringen i fremtiden; det er en veldig fin ting å kunne gjøre.

Publisert på 11/10/2012 klokken 17:08
kilden bruker
På andre språk...                            


3 svar

stemmer
39

Getter-bare eiendommer ble introdusert i Loggfila 2.0 :

interface foo {
    readonly bar: boolean;
}
Svarte 13/04/2017 kl. 11:09
kilden bruker

stemmer
17

Ja, dette er en begrensning av grensesnitt. Hvorvidt tilgang til eiendommen er implementert med en getter er en implementering detalj og dermed bør ikke være en del av den felles grensesnitt. Se også dette spørsmålet .

Hvis du trenger en skrivebeskyttet attributt spesifisert i et grensesnitt, kan du legge til en getter metode:

interface foo {
    getAttribute() : string;
}
Svarte 11/10/2012 kl. 18:16
kilden bruker

stemmer
0

Som @Vitaliy Ulantikov besvart, kan du bruke readonlymodifier på en eiendom. Denne fungerer akkurat som en getter.

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

Når et objekt bokstavelig implementerer grensesnittet, kan du ikke overskrive en readonlyeiendom:

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

Men når en klasse implementerer grensesnittet, er det ingen måte å unngå å overskrive den.

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

Jeg antar det er fordi når du re-erklære eiendommer i klassen definisjonen, de overstyre egenskapene til grensesnittet, og er ikke lenger skrivebeskyttet.

For å fikse det, kan du bruke readonlypå eiendommene direkte i klasse som implementerer grensesnittet

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

Se selv i lekeplassen .

Svarte 14/09/2018 kl. 05:03
kilden bruker

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