jen aby třída vidět uvnitř modulu: strojopisem

hlasů
9

Podívejte se na následující kód:

module MyModule {
    class MyPrivateClass {
        ...
    }

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

Chci MyPrivateClass být viditelný pouze zevnitř MyModule , speciálně pro vnitřní použití v MyPublicClass . Mimo MyModule pouze MyPublicClass by měly být viditelné. Myslel jsem si, že výše uvedené layout by měl dělat, ale VS si stěžuje, že MyPrivateClass není vidět dovnitř MyPublicClass . Přidání export před definice MyPrivateClass dělá to viditelné MyPublicClass , ale pak je to také aby byly viditelné zvenku.

Existuje způsob, aby bylo viditelné pro MyPublicClass pouze?

Děkuji.

Položena 08/10/2012 v 13:28
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
7

Zde je funkční příklad, který ukazuje soukromou třídu, veřejné třídy, s použitím vlastní třídy z veřejné třídy a pokoušet se použít soukromý třídu, která generuje chybu.

Pokud se zobrazí chyba, jste schopni zveřejnit jméno, které se pokoušíte použít pro modul, který způsobuje tento problém?

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
Odpovězeno 12/10/2012 v 17:32
zdroj uživatelem

hlasů
2

Pokud chcete, aby to bylo v soukromí v emmitted JavaScriptu, můžete to udělat pohybem instance soukromé Clas se uvnitř modulu, ale ne ve straně vyváženy třídou.

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();
Odpovězeno 03/01/2013 v 17:39
zdroj uživatelem

hlasů
0

Říkal jste, že v jednom ze svých komentářů:

Je to zvláštní: Mám-li vložit kód jak je uvedeno výše (vy nebo dole), to je v pořádku. Ale jakmile jsem se změnit název modulu na své skutečné jméno, chybu jsem popsal neobjeví

To zní velmi podobný problém jsem zažil. To bylo způsobeno tím, že jsem byl s použitím různých referenčních cest importovat moduly. Jako výsledek uvnitř členů modul nelze získat přístup k sobě navzájem.

Je mi líto, ale nemůžu si vzpomenout žádné další podrobnosti a já jsem nebyl schopen reprodukovat vaše (nebo My) chybu. To je asi zbytečné, ale myslel jsem, že podělit o své zkušenosti přesto: Míchání referenční cesty a moduly se zdá způsobit velmi podivné chyby.

Navíc někdy VisualStudio chová poněkud podivné. Jsem v současné době pracuje na psacím stroji projektu společně s kamarádem. Kód je uložen v GitHub repo. Oba jsme vytáhl stejnou verzi. Pracoval jsem v pořádku pro mě a byl posypaný chybových zpráv pro něj. Stejný OS, stejná verze strojopisu, stejnou verzi VisualStudio, ... Zajímavé je, že chyba byla v souvislosti s moduly, taky. Modul, který byl dovezen zdálo být „prázdná“. Veškerý kód, který se pokusil použít obsah tohoto modulu byl označen červeně. On restartován VisualStudio a najednou, kód byl přijat jako platný. Nechtěli jsme nic měnit! Je sestaven bez problémů taky.

Odpovězeno 19/01/2013 v 13:15
zdroj uživatelem

hlasů
0

Hmm, nevidím žádné problémy s tím, ale nezapomeňte inicializovat hodnoty pole, jinak kompilátor nevygeneruje pole:

module MyModule {
    class MyPrivateClass {

    }

    export class MyPublicClass {
        private instance: MyPrivateClass; // MyPrivateClass is unknown
        constructor() {
           this.instance = new MyPrivateClass();
        }
    }
}
Odpovězeno 08/10/2012 v 13:40
zdroj uživatelem

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