2013-03-07 10 views
45

Qual è l'equivalente di protetto in TypeScript?Qual è l'equivalente di protetto in TypeScript?

ho bisogno di aggiungere alcune variabili membro della classe di base deve essere utilizzato solo in classi derivate.

+0

È possibile votare fino questo problema CodePlex: http://typescript.codeplex.com/workitem/125 –

+1

Ho aggiornato la mia risposta per riflettere che 'protected' è atterrato: https://github.com/Microsoft/TypeScript/pull/688 – Fenton

risposta

48

Aggiornamenti

12 novembre 2014. La versione 1.3 del dattiloscritto è disponibile e include la parola chiave protetta.

26 settembre 2014. La parola chiave protected è stata interrotta. Attualmente è pre-release. Se stai usando una versione molto nuova di TypeScript, ora puoi usare la parola chiave protected ... la risposta sotto è per le versioni precedenti di TypeScript. Godere.

View the release notes for the protected keyword

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

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

Vecchio risposta

Carattere tipografico ha solo private - non protetto e questo significa solo privata durante la fase di compilazione controllo.

Se si desidera accedere a super.property deve essere pubblico.

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

Come circa il seguente approccio:

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

Poiché la variabile num è definito come pubblico, questo funzionerà:

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

Ma poiché non è definito nell'interfaccia, questo :

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

corrisponderà a The property 'num' does not exist on value of type 'MyType'.
Puoi provare in questo playground.

È anche possibile avvolgerlo in un modulo esportando solo l'interfaccia, quindi da altri metodi esportati è possibile restituire le istanze (factory), in questo modo l'ambito pubblico delle variabili verrà "contenuto" nel modulo.

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' 

Versione modificata in questo playground.

So che non è esattamente quello che hai chiesto, ma è piuttosto vicino.

Problemi correlati