2016-06-13 3 views
14

Sto usando TypeScript nel mio progetto e ho riscontrato un problema. Sto definendo un'interfaccia simile a questo:TypeScript definisce la proprietà privata quando si implementa un'interfaccia

interface IModuleMenuItem { 
    name: string; 
} 

Voglio creare una classe che implementi da questa interfaccia, ma voglio nome sia una proprietà privata in questo modo:

class ModuleMenuItem implements IModuleMenuItem { 
    private name: string; 
} 

Sono ottenere il seguente errore:

Class ModuleMenuItem incorrectly implements interface IModuleMenuItem. Property name is private in type ModuleMenuItem but not in type IModuleMenuItem.

Come è possibile definire una proprietà privata o protetta quando si implementa un'interfaccia?

+0

Le interfacce sono fondamentalmente qui per definire ciò che è pubblico. Non sono sicuro che tu abbia un modo per verificare cosa è privato. – Blackus

risposta

16

Le interfacce definiscono contratti "pubblici" e come tali non ha senso avere il modificatore di accesso protected o private sulle interfacce, che sono più di un, chiamiamolo, dettagli di implementazione. In quanto tale, non puoi fare ciò che vuoi con un'interfaccia.

Se si vuole fare la proprietà di sola lettura per i consumatori, ma override in una sottoclasse, allora si può fare qualcosa di simile:

interface IModuleMenuItem { 
    getName(): string; 
} 

class ModuleMenuItem implements IModuleMenuItem { 
    private name; 

    public getName() { 
     return name;  
    } 

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

penso a macchina 2.0 (non ancora fuori) si vuole essere in grado di utilizzare il modificatore di accesso readonly se tu fossi dopo l'inizializzazione in tempo campo di sola lettura - 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"; 
    } 
} 
+0

Allora, qual è l'affare? Voglio dire è semplicemente stupido, rovina l'intero punto delle interfacce. – Pachu

+2

@Pachu Per me questo è l'intero punto delle interfacce. Si tratta di definire un contratto ** pubblico ** a cui un'implementazione "si conforma" e un componente esterno può consumare senza preoccuparsi di come è implementato. Quello che cercate è rafforzare il comportamento di implementazione, che è ottenuto attraverso astratte classi di base nella maggior parte delle lingue. –

2

Penso che si può fare in questo modo

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   
    } 
} 
+0

Non funziona amico mio. Dov'è il valore? – Mouneer

+0

mi dispiace per quello. ha modificato la risposta. –

-1

Penso che nel costruttore dovresti avere: _name sarà assegnato nel metodo get (nome) {} come this_name = nome;

constructor() { this.name = name }