Este posibil să se utilizeze getteri / setter dactilografiat Interfețe?

voturi
29

Aș dori să definească o interfață cu o proprietate readonly. De exemplu;

interface foo {
    get bar():bool;
}

Cu toate acestea, acest lucru dă eroare de sintaxă, „de așteptat«;»“ pe bara. Am configurare VisualStudio mea de a utiliza ținta ES5, așa că getteri sunt acceptate. Este aceasta o limitare de interfețe? Este posibil ca această schimbare în viitor; acesta este un lucru foarte frumos pentru a fi capabil să facă.

Întrebat 11/10/2012 la 18:08
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
31

Proprietăți numai getter au fost introduse în dactilografiat 2.0 :

interface foo {
    readonly bar: boolean;
}
Publicat 13/04/2017 la 11:09
sursa de către utilizator

voturi
17

Da, aceasta este o limitare a interfețelor. Indiferent dacă sunt sau nu accesul la proprietate este implementat cu un getter este un detaliu de punere în aplicare și , prin urmare , nu ar trebui să facă parte din interfața publică. A se vedea , de asemenea , această întrebare .

Dacă aveți nevoie de un atribut specificat într-o numai citire interfață, puteți adăuga o metodă getter:

interface foo {
    getAttribute() : string;
}
Publicat 11/10/2012 la 19:16
sursa de către utilizator

voturi
0

Ca răspuns @Vitaliy Ulantikov, puteți utiliza readonlymodificatorul pe o proprietate. Aceasta acționează exact ca un getter.

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

Atunci când un literal obiect implementeaza interfata, nu puteți suprascrie o readonlyproprietate:

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

Dar când o clasă implementează interfața, nu există nici o modalitate de a evita suprascrierea.

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

Cred că pentru că atunci când re-declare proprietăți în definiția de clasă, ei suprascrie proprietățile interfeței, și nu mai sunt readonly.

Pentru a remedia că, utilizați readonlype proprietățile direct în clasa care implementeaza interfata

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

A se vedea pentru tine în locul de joacă .

Publicat 14/09/2018 la 05:03
sursa de către utilizator

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