2013-03-07 16 views
45

Jaki jest odpowiednik chroniony w TypeScript?Jaki jest odpowiednik chroniony w TypeScript?

muszę dodać kilka zmiennych składowych w klasie bazowej być stosowane tylko w klas pochodnych.

+0

Możesz głosować tę Codeplex problem: http://typescript.codeplex.com/workitem/125 –

+1

Zaktualizowałem swoją odpowiedź, aby odzwierciedlić fakt, że 'protected' wylądował: https://github.com/Microsoft/TypeScript/pull/688 – Fenton

Odpowiedz

48

Aktualizacje

12 listopada 2014 roku wersja 1.3 maszynopis jest dostępny i zawiera chronioną słowa kluczowego.

26 września 2014 r. Słowo kluczowe protected wylądowało. Obecnie jest w fazie przedpremierowej. Jeśli używasz bardzo nowej wersji TypeScript, możesz teraz użyć słowa kluczowego protected ... odpowiedź poniżej dotyczy starszych wersji TypeScript. Cieszyć się.

View the release notes for the protected keyword

class A { 
    protected x: string = 'a'; 
} 

class B extends A { 
    method() { 
     return this.x; 
    } 
} 

Old Odpowiedź

maszynopis ma tylko private - nie chroniony, a to oznacza tylko prywatny podczas kompilacji kontroli. Aby uzyskać dostęp do super.property, musi on być publiczny.

class A { 
    // Setting this to private will cause class B to have a compile error 
    public x: string = 'a'; 
} 

class B extends A { 
    method() { 
     return super.x; 
    } 
} 
4

Jak o następującym podejściu:

interface MyType { 
    doit(): number; 
} 

class A implements MyType { 
    public num: number; 

    doit() { 
     return this.num; 
    } 
} 

class B extends A { 
    constructor(private times: number) { 
     super(); 
    } 

    doit() { 
     return super.num * this.times; 
    } 
} 

Ponieważ zmienna num jest zdefiniowane jako publiczne, to będzie działać:

var b = new B(4); 
b.num; 

Ale ponieważ to nie jest zdefiniowane w interfejsie, to :

var b: MyType = new B(4); 
b.num; 

spowoduje The property 'num' does not exist on value of type 'MyType'.
Możesz spróbować tego w tym playground.

Można również zawinąć go w moduł podczas eksportowania tylko interfejsu, a następnie z innych wyeksportowanych metod można zwrócić instancje (fabryczne), w ten sposób publiczny zakres zmiennych zostanie "zawarty" w module.

module MyModule { 
    export interface MyType { 
     doit(): number; 
    } 

    class A implements MyType { 
     public num: number; 

     doit() { 
      return this.num; 
     } 
    } 

    class B extends A { 
     constructor(private times: number) { 
      super(); 
     } 

     doit() { 
      return super.num * this.times; 
     } 
    } 

    export function factory(value?: number): MyType { 
     return value != null ? new B(value) : new A(); 
    } 
} 

var b: MyModule.MyType = MyModule.factory(4); 
b.num; /// The property 'num' does not exist on value of type 'MyType' 

Zmodyfikowana wersja tej playground.

Wiem, że nie jest to dokładnie to, o co prosiłeś, ale jest całkiem blisko.

Powiązane problemy