web-dev-qa-db-fra.com

Comment définir une propriété privée lors de l'implémentation d'une interface dans Typescript?

J'utilise TypeScript dans mon projet et j'ai rencontré un problème. Je définis une interface comme celle-ci:

interface IModuleMenuItem {
    name: string;
}

Je veux créer une classe qui implémente cette interface, mais je veux que le nom soit une propriété privée comme celle-ci:

class ModuleMenuItem implements IModuleMenuItem {
    private name: string;
}

Je reçois l'erreur suivante:

La classe ModuleMenuItem n'implémente pas correctement l'interface IModuleMenuItem. Le nom de la propriété est privé dans le type ModuleMenuItem mais pas dans le type IModuleMenuItem.

Comment définir une propriété comme privée ou protégée lors de l'implémentation d'une interface?

35
Pachu

Les interfaces définissent les contrats "publics" et il n’a donc aucun sens d’avoir le modificateur d’accès protected ou private sur les interfaces, qui sont plutôt un détail d’implémentation. En tant que tel, vous ne pouvez pas faire ce que vous voulez avec une interface.

Si vous souhaitez que la propriété soit en lecture seule pour les consommateurs, mais qu'elle puisse être remplacée dans une sous-classe, vous pouvez procéder de la manière suivante:

interface IModuleMenuItem {
     getName(): string;
}

class ModuleMenuItem implements IModuleMenuItem {
    private name;

    public getName() {
        return name;    
    }

    protected setName(newName : string) {
        name = newName;
    }
}

Je pense que dans TypeScript 2.0 (pas encore sorti), vous pourrez utiliser le modificateur d'accès readonly si vous étiez après le champ en lecture seule du moment d'initialisation - https://basarat.gitbooks.io/TypeScript /content/docs/types/readonly.html

interface IModuleMenuItem {
     readonly name : string;
}

class ModuleMenuItem implements IModuleMenuItem {
    public readonly name : string;

    constructor() {
        name = "name";
    }
}
38
Ivan Zlatev

Je pense que tu peux le faire comme ça

interface IModuleMenuItem{
    name: string
}

class ModuleMenuItem implements IModuleMenuItem {
    private _name: string;
    constructor() {
    _name = "name";
    }

    get name(){
    // your implementation to expose name
    }

    set name(value){
    // your implementation to set name         
    }
 }
4
Abdelrahman Hossam