Можно ли использовать геттеры / сеттеры в машинописном Интерфейсы?

голоса
29

Я хотел бы определить интерфейс с только для чтения свойства. Например;

interface foo {
    get bar():bool;
}

Тем не менее, это дает синтаксическую ошибку, «ожидается,»на панели. У меня есть настройки моего VisualStudio использовать цель ES5, так добытчики поддерживаются. Является ли это ограничение интерфейсов? Могло бы это изменение в будущем; это очень хорошая вещь, чтобы быть в состоянии сделать.

Задан 11/10/2012 в 18:08
источник пользователем
На других языках...                            


3 ответов

голоса
31

Геттерные свойства только были введены в машинописи 2.0 :

interface foo {
    readonly bar: boolean;
}
Ответил 13/04/2017 в 11:09
источник пользователем

голоса
17

Да, это ограничение интерфейсов. Независимо от того или нет доступа к собственности осуществляется с геттером является деталь реализации и , следовательно , не должна быть частью общего интерфейса. Смотрите также на этот вопрос .

Если вам нужен только для чтения атрибут, указанный в интерфейсе, вы можете добавить метод получения:

interface foo {
    getAttribute() : string;
}
Ответил 11/10/2012 в 19:16
источник пользователем

голоса
0

Как ответил @Vitaliy Ulantikov, вы можете использовать readonlyмодификатор свойства. Это действует точно так же , как добытчик.

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

Когда объект буквальный реализуют интерфейс, вы не можете перезаписать readonlyсвойство:

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

Но когда класс реализует интерфейс, нет никакого способа , чтобы избежать его перезаписи.

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

Я предполагаю, что это потому, что, когда вы повторно объявлять свойства в определении класса, они переопределяют свойство интерфейса, и больше не только для чтения.

Чтобы исправить это, используйте readonlyна свойства непосредственно в классе , который реализует интерфейс

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

Смотрите сами на детской площадке .

Ответил 14/09/2018 в 05:03
источник пользователем

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