2013-03-07 7 views
45

Was entspricht geschützt in TypeScript?Was ist in TypeScript geschützt?

Ich brauche einige Membervariablen in der Basisklasse hinzufügen- nur in abgeleiteten Klassen verwendet werden.

+0

Sie können diese CodePlex Ausgabe vote up: http://typescript.codeplex.com/workitem/125 –

+1

Ich habe meine Antwort aktualisiert, um anzuzeigen, dass "protected" gelandet ist: https://github.com/Microsoft/TypeScript/pull/688 – Fenton

Antwort

48

Updates

12. November 2014 Version 1.3 von Typoskript verfügbar und enthält das geschützte Schlüsselwort.

26. September 2014. Das protected Schlüsselwort ist gelandet. Es ist derzeit Vorabveröffentlichung. Wenn Sie eine sehr neue Version von TypeScript verwenden, können Sie jetzt das Schlüsselwort protected verwenden ... Die folgende Antwort bezieht sich auf ältere Versionen von TypeScript. Genießen.

View the release notes for the protected keyword

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

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

Alte Antwort

Typoskript hat nur private - nicht geschützt und das bedeutet, nur die Überprüfung während der Kompilierung Zeit privat.

Wenn Sie auf super.property zugreifen möchten, muss es öffentlich sein.

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

Wie zu folgendem Ansatz:

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

Da die num Variable als öffentliche definiert ist, wird diese Arbeit:

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

Aber da es in der Schnittstelle nicht definiert ist, diese :

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

wird The property 'num' does not exist on value of type 'MyType' ergeben.
Sie können es in diesem playground versuchen.

Sie können es auch in ein Modul einbinden, während Sie nur die Schnittstelle exportieren, dann können Sie von anderen exportierten Methoden die Instanzen (Factory) zurückgeben, so dass der öffentliche Gültigkeitsbereich der Variablen im Modul "enthalten" ist.

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' 

Modifizierte Version in diesem playground.

Ich weiß, es ist nicht genau das, wonach Sie gefragt haben, aber es ist ziemlich nah.

Verwandte Themen