¿Es posible usar getters / setters a máquina de escribir interfaces?

votos
29

Me gustaría definir una interfaz con una propiedad de sólo lectura. Por ejemplo;

interface foo {
    get bar():bool;
}

Sin embargo, esto da el error de sintaxis, se esperaba ';' en la barra. He fijado mi VisualStudio usar el objetivo ES5, por lo captadores son compatibles. ¿Es esta una limitación de las interfaces? Podría este cambio en el futuro; es una cosa muy agradable ser capaz de hacer.

Publicado el 11/10/2012 a las 18:08
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
31

Propiedades de captador-sólo se introdujeron en Letra de imprenta 2.0 :

interface foo {
    readonly bar: boolean;
}
Respondida el 13/04/2017 a las 08:09
fuente por usuario

votos
17

Sí, esto es una limitación de interfaces. Sea o no el acceso a la propiedad se implementa con un captador es un detalle de implementación y por lo tanto no debe ser parte de la interfaz pública. Véase también esta pregunta .

Si necesita un atributo de sólo lectura se especifica en una interfaz, se puede añadir un método de obtención:

interface foo {
    getAttribute() : string;
}
Respondida el 11/10/2012 a las 19:16
fuente por usuario

votos
0

Como respondió @Vitaliy Ulantikov, puede utilizar el readonlymodificador en una propiedad. Esto actúa exactamente igual que un comprador.

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

Cuando un objeto literal implementa la interfaz, no se puede sobrescribir una readonlypropiedad:

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

Pero cuando una clase implementa la interfaz, no hay manera de evitar sobrescribir ella.

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

Supongo que es porque cuando se vuelva a declarar propiedades en la definición de clase, que anulan las propiedades de la interfaz, y ya no son de sólo lectura.

Para corregir esto, utilizar readonlyen las propiedades directamente en la clase que implementa la interfaz

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

Ver por sí mismo en el parque infantil .

Respondida el 14/09/2018 a las 05:03
fuente por usuario

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