solo modulo all'interno visibile rendere classe: dattiloscritto

voti
9

Date un'occhiata al seguente codice:

module MyModule {
    class MyPrivateClass {
        ...
    }

    export class MyPublicClass {
        private var: MyPrivateClass; // MyPrivateClass is unknown
    }
}

Voglio MyPrivateClass sia visibile solo all'interno MyModule , specificamente per uso interno in MyPublicClass . Fuori MyModule , solo MyPublicClass dovrebbe essere visibile. Ho pensato che il layout di cui sopra dovrebbe fare, ma VS lamenta che MyPrivateClass non è visibile all'interno MyPublicClass . L'aggiunta di esportazione prima la definizione di MyPrivateClass rende visibile al MyPublicClass ma poi è anche visibile dall'esterno.

C'è un modo per renderlo visibile a MyPublicClass solo?

Grazie.

È pubblicato 08/10/2012 alle 13:28
fonte dall'utente
In altre lingue...                            


4 risposte

voti
7

Ecco un esempio funzionante, che mostra la classe privata, la classe pubblico, utilizzando la classe privata dalla classe pubblico e il tentativo di utilizzare la classe privata, che genera un errore.

Se si ottiene ancora un errore, si è in grado di rivelare il nome che si sta tentando di utilizzare per il modulo che causa il problema?

module MyModule {
    class MyPrivateClass {
        doSomething() {
            return 1;
        }
    }

    export class MyPublicClass {
        private x = new MyPrivateClass();

        someFunction() {
            return this.x.doSomething();
        }
    }
}

var examplePublic = new MyModule.MyPublicClass();
var result = examplePublic.someFunction(); // 1

var examplePrivate = new MyModule.MyPrivateClass(); // error
Risposto il 12/10/2012 a 17:32
fonte dall'utente

voti
2

Se si vuole che sia privato nel JavaScript emmitted è possibile farlo spostando l'istanza clas privati ​​all'interno del modulo, ma non nella parte della classe esportato.

module MyModule {
    class MyPrivateClass {
        prop1: number = 1;
    }

    var foo: MyPrivateClass = new MyPrivateClass();

    export class MyPublicClass {
        someMethod(){
            var bar = foo.prop1;
        }
    }
}

var x = new MyModule.MyPublicClass();
Risposto il 03/01/2013 a 17:39
fonte dall'utente

voti
0

Lei ha detto in uno dei suoi commenti:

È strano: Se io incollare il codice di cui sopra (tua o la mia), va bene. Ma appena posso cambiare il nome del modulo per il suo vero nome, l'errore che ha descritto appare

Questo suona molto simile ad un problema che ho sperimentato. E 'stato causato perché ero stato utilizzando vari percorsi di riferimento per importare i moduli. Come risultato all'interno di una parte del modulo non potrebbe accedere a vicenda.

Mi dispiace, ma non riesco a ricordare altri dettagli e non sono stato in grado di riprodurre la vostra (o il mio) errore. Questo è probabilmente inutile, ma ho pensato di condividere la mia esperienza, tuttavia: Mixing percorsi di riferimento e moduli sembra causare molto strani errori.

Inoltre a volte VisualStudio si comporta piuttosto strano. Attualmente sto lavorando ad un progetto dattiloscritto insieme ad un amico. Il codice è memorizzato in un repo github. Entrambi abbiamo tirato la stessa versione. Ho lavorato bene per me ed è stato cosparso di messaggi di errore per lui. Stesso sistema operativo, stessa versione di tipografico, stessa versione di VisualStudio, ... È interessante notare che l'errore era legato a moduli, anche. Un modulo che è stato importato sembrava essere "vuoto". Tutto il codice che ha cercato di utilizzare il contenuto di questo modulo è stato segnato in rosso. Ha riavviato VisualStudio e tutto ad un tratto, il codice è stato accettato come valido. Non abbiamo cambiato nulla! E 'stato compilato senza problemi, anche.

Risposto il 19/01/2013 a 13:15
fonte dall'utente

voti
0

Hmm, non vedo alcun problema con esso, ma non dimenticate di inizializzare il valore del campo, altrimenti il ​​compilatore non generare il campo:

module MyModule {
    class MyPrivateClass {

    }

    export class MyPublicClass {
        private instance: MyPrivateClass; // MyPrivateClass is unknown
        constructor() {
           this.instance = new MyPrivateClass();
        }
    }
}
Risposto il 08/10/2012 a 13:40
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more