Est-il possible d'utiliser getters / setters dactylographiée Interfaces?

voix
29

Je voudrais définir une interface avec une propriété en lecture seule. Par exemple;

interface foo {
    get bar():bool;
}

Cependant, cela donne l'erreur de syntaxe, « attendu, » sur la barre. J'ai installé mon VisualStudio d'utiliser la cible ES5, donc getters sont pris en charge. Est-ce une limitation des interfaces? Ce changement pourrait à l'avenir; il est une chose très agréable d'être en mesure de le faire.

Créé 11/10/2012 à 18:08
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
31

Propriétés getter seulement ont été introduites dans Tapuscrit 2.0 :

interface foo {
    readonly bar: boolean;
}
Créé 13/04/2017 à 11:09
source utilisateur

voix
17

Oui, ceci est une limitation des interfaces. Que ce soit ou non l'accès à la propriété est mis en œuvre avec un getter est un détail de mise en œuvre et ne devrait donc pas faire partie de l'interface publique. Voir aussi cette question .

Si vous avez besoin d'un attribut spécifié dans une lecture seule interface, vous pouvez ajouter une méthode de lecture:

interface foo {
    getAttribute() : string;
}
Créé 11/10/2012 à 19:16
source utilisateur

voix
0

Comme @Vitaliy Ulantikov a répondu, vous pouvez utiliser le readonlymodificateur sur une propriété. Cela agit exactement comme un getter.

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

Lorsqu'un littéral d'objet implémente l'interface, vous ne pouvez pas remplacer une readonlypropriété:

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

Mais quand une classe implémente l'interface, il n'y a aucun moyen d'éviter l' écraser.

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

Je suppose que c'est parce que lorsque vous choisissez déclariez les propriétés dans la définition de la classe, ils remplacent les propriétés de l'interface, et ne sont plus en lecture seule.

Pour résoudre ce problème, utilisez readonlyles propriétés directement dans la classe qui implémente l'interface

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

Voyez vous - même dans la cour de récréation .

Créé 14/09/2018 à 05:03
source utilisateur

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