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?
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";
}
}
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
}
}