Czy jest możliwe aby użyć pobierające / ustawiające w maszynopisie interfejsów?

głosy
29

Chciałbym zdefiniować interfejs z właściwością tylko do odczytu. Na przykład;

interface foo {
    get bar():bool;
}

Jednak ta daje błąd składni, „oczekiwać«»” na pasku. Mam ustawienia mojego VisualStudio używać target ES5, więc getters są obsługiwane. Jest to ograniczenie interfejsów? Może się to zmienić w przyszłości; jest to bardzo miła rzecz, aby móc to zrobić.

Utwórz 11/10/2012 o 18:08
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
31

Getter właściwości tylko wprowadzono w Typescript 2.0 :

interface foo {
    readonly bar: boolean;
}
Odpowiedział 13/04/2017 o 11:09
źródło użytkownik

głosy
17

Tak, jest to ograniczenie interfejsów. Czy dostęp do nieruchomości jest realizowany z getter jest szczegółów wdrażania, a zatem nie powinny być częścią interfejsu publicznego. Zobacz także na to pytanie .

Jeśli potrzebujesz tylko do odczytu atrybut określony w interfejsie, można dodać metodę getter:

interface foo {
    getAttribute() : string;
}
Odpowiedział 11/10/2012 o 19:16
źródło użytkownik

głosy
0

Jak odpowiedział @Vitaliy Ulantikov, można użyć readonlymodyfikatora na właściwości. To działa dokładnie tak samo jak getter.

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

Gdy dosłowne obiekt implementuje interfejs, nie można nadpisać readonlywłaściwość:

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

Ale gdy klasa implementuje interfejs, nie ma sposobu, aby uniknąć nadpisania go.

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

Myślę, że to dlatego, że gdy ponownie zadeklarować właściwości w definicji klasy, które zastępują właściwości interfejsu, a nie są już tylko do odczytu.

Aby to naprawić, należy readonlyna właściwości bezpośrednio w klasie, która implementuje interfejs

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

Przekonaj się na placu zabaw .

Odpowiedział 14/09/2018 o 05:03
źródło użytkownik

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