nur machen Klasse sichtbar innen Modul: Typoskript

stimmen
9

Werfen Sie einen Blick auf den folgenden Code:

module MyModule {
    class MyPrivateClass {
        ...
    }

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

Ich möchte MyPrivateClass nur sichtbar innen sein MyModule , die speziell für den internen Gebrauch in MyPublicClass . Außerhalb MyModule , nur MyPublicClass sollte sichtbar sein. Ich dachte , dass das obige Layout tun soll , aber VS beklagt , dass MyPrivateClass innen nicht sichtbar ist MyPublicClass . Hinzufügen Export vor der Definition von MyPrivateClass es sichtbar macht MyPublicClass dann aber auch sichtbar , es ist von außen.

Gibt es eine Möglichkeit , es sichtbar zu machen MyPublicClass nur?

Vielen Dank.

Veröffentlicht am 08/10/2012 um 13:28
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
7

Hier ist ein funktionierendes Beispiel, das die private Klasse zeigt, die öffentliche Klasse, die private Klasse von der öffentlichen Klasse verwenden und versuchen, die private Klasse zu verwenden, die einen Fehler erzeugt.

Wenn Sie immer noch eine Fehlermeldung erhalten, können Sie den Namen offen zu legen Sie für das Modul zu verwenden versuchen, die das Problem verursacht?

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
Beantwortet am 12/10/2012 um 17:32
quelle vom benutzer

stimmen
2

Wenn Sie es wollen, in der emmitted JavaScript privat sein können Sie dies tun, indem die private cla Instanz im Inneren des Moduls zu bewegen, aber nicht in der Seite der exportierten Klasse.

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();
Beantwortet am 03/01/2013 um 17:39
quelle vom benutzer

stimmen
0

Du hast gesagt, in einem Ihrer Kommentare:

Es ist seltsam: Wenn ich den Code wie oben (deine oder meine) einfügen, es ist in Ordnung. Aber sobald ich den Namen des Moduls an seinen richtigen Namen zu ändern, der Fehler beschrieben I erscheint

Das klingt sehr ähnlich zu einem Problem, das ich erlebt habe. Es wurde verursacht, weil ich verschiedene Referenzpfade verwendet worden war, um die Module zu importieren. Als Ergebnis innerhalb eines Modulelemente zugreifen konnten einander nicht.

Es tut mir leid, aber ich kann keine weitere Einzelheiten nicht erinnern, und ich habe nicht in der Lage gewesen, Ihr (oder meine) Fehler zu reproduzieren. Dies ist wahrscheinlich nutzlos, aber ich dachte, ich würde doch meine Erfahrung teilen: Referenz Mischwege und Module sehr seltsame Fehler zu verursachen scheint.

Außerdem manchmal verhält sich Visual Studio ziemlich seltsam. Ich arbeite derzeit an einem Typoskript Projekt zusammen mit einem Freund. Der Code wird in einem Github Repo gespeichert. Wir zogen beide die gleiche Version. Ich arbeitete für mich in Ordnung und wurde mit Fehlermeldungen für ihn gesprengt. Gleiches O, gleiche Version von Typoskript, gleicher Version von Visual Studio, ... Interessanterweise wurde der Fehler auf Module bezogen, auch. Ein Modul, das importiert wurde schien „leer“ zu sein. Der gesamte Code, der den Inhalt dieses Moduls zu verwenden versucht wurde rot markiert. Er Neustart Visual Studio und ganz plötzlich wurde der Code als gültig akzeptiert. Wir haben nichts ändern! Es problemlos zusammengestellt, auch.

Beantwortet am 19/01/2013 um 13:15
quelle vom benutzer

stimmen
0

Hmm, ich sehe keine Probleme mit ihm, aber vergessen Sie nicht, den Feldwert zu initialisieren, sonst wird der Compiler das Feld nicht erzeugen:

module MyModule {
    class MyPrivateClass {

    }

    export class MyPublicClass {
        private instance: MyPrivateClass; // MyPrivateClass is unknown
        constructor() {
           this.instance = new MyPrivateClass();
        }
    }
}
Beantwortet am 08/10/2012 um 13:40
quelle vom benutzer

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