2016-06-13 10 views
14

Używam TypeScript w moim projekcie i natknąłem się na problem. jestem definiowania interfejs tak:TypeScript definiuje własność prywatną podczas implementowania interfejsu

interface IModuleMenuItem { 
    name: string; 
} 

Chcę utworzyć klasę, która implementuje z tego interfejsu, ale chcę być nazwa prywatna własność tak:

class ModuleMenuItem implements IModuleMenuItem { 
    private name: string; 
} 

jestem następujący błąd:

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

Jak mogę zdefiniować własność prywatną lub chronioną podczas implementacji interfejsu?

+0

Interfejsy są w zasadzie tutaj, aby określić, co jest publiczne. Nie jestem pewien, czy masz sposób sprawdzenia, co jest prywatne. – Blackus

Odpowiedz

16

Interfejsy definiują "publiczne" kontrakty i jako takie nie ma sensu mieć modyfikatora dostępu na interfejsach, który jest bardziej, nazwijmy to, szczegółem implementacji. W związku z tym nie możesz robić tego, co chcesz, za pomocą interfejsu.

Jeśli chcesz, aby właściwość tylko do odczytu dla konsumentów, ale przeciążać w podklasie następnie można zrobić coś takiego:

interface IModuleMenuItem { 
    getName(): string; 
} 

class ModuleMenuItem implements IModuleMenuItem { 
    private name; 

    public getName() { 
     return name;  
    } 

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

myślę w maszynopisie 2.0 (nie jeszcze na zewnątrz), które będą móc korzystać z modyfikatora readonly dostępu, jeśli były po inicjalizacji czasu tylko do odczytu pola - 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

Więc jaka jest umowa? Mam na myśli to, że jest po prostu głupi, To niszczy cały punkt interfejsów. – Pachu

+2

@Pachu Dla mnie to cały punkt interfejsów. Ma on na celu zdefiniowanie ** zamówienia publicznego **, do którego "dostosowuje się" implementacja, a komponent zewnętrzny może konsumować bez dbałości o to, jak jest on implementowany. To, o co prosisz, bardziej egzekwuje zachowania implementacyjne, które są osiągane poprzez abstrakcyjne klasy bazowe w większości języków. –

2

myślę, że może to zrobić tak

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

Nie działa mój przyjaciel. Gdzie jest wartość? – Mouneer

+0

Przepraszam za to. edytował odpowiedź. –

-1

Myślę, że w konstruktorze powinieneś mieć: _nazwa zostanie przypisana w metodzie get (name) {} jako nazwa_tuta = nazwa;

constructor() { this.name = name }

Powiązane problemy