Tapuscrit: faire module à l'intérieur de la classe visible uniquement

voix
9

Jetez un coup d'oeil sur le code suivant:

module MyModule {
    class MyPrivateClass {
        ...
    }

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

Je veux MyPrivateClass être visibles à l' intérieur MyModule , en particulier pour un usage interne dans MyPublicClass . En dehors MyModule , ne MyPublicClass doit être visible. Je me suis dit que la disposition ci - dessus devrait faire , mais VS se plaint que MyPrivateClass ne sont pas visibles à l' intérieur MyPublicClass . Ajout d' exportation avant la définition de MyPrivateClass le rend visible à MyPublicClass , mais il est aussi visible de l'extérieur.

Est - il un moyen de le rendre visible à MyPublicClass seulement?

Je vous remercie.

Créé 08/10/2012 à 13:28
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
7

Voici un exemple de travail qui montre la classe privée, la classe publique, en utilisant la classe privée de la classe publique et d'essayer d'utiliser la classe privée, ce qui génère une erreur.

Si vous obtenez toujours une erreur, vous êtes en mesure de divulguer le nom que vous essayez d'utiliser pour le module qui cause le problème?

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
Créé 12/10/2012 à 17:32
source utilisateur

voix
2

Si vous voulez qu'il soit privé dans le code JavaScript que vous pouvez faire émise mais en déplaçant l'instance clas privé à l'intérieur du module, mais pas dans le côté de la classe exportée.

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();
Créé 03/01/2013 à 17:39
source utilisateur

voix
0

Vous avez dit dans un de vos commentaires:

Il est étrange: Si je coller le code comme ci-dessus (le vôtre ou le mien), il est très bien. Mais dès que je change le nom du module à son vrai nom, l'erreur que je décrit apparaît

Cela semble très similaire à un problème que je l'ai vécu. Il a été causé parce que j'avais été en utilisant différents chemins de référence pour importer les modules. Par conséquent à l'intérieur d'un des membres du module ne pouvaient pas accéder à l'autre.

Je suis désolé mais je ne me souviens pas plus de détails et je ne l'ai pas été en mesure de reproduire votre (ou ma) erreur. Ceci est probablement inutile, mais je pensais que je voudrais partager mon expérience néanmoins: mélange des chemins de référence et des modules semble provoquer des erreurs étranges.

De plus, parfois VisualStudio se comporte plutôt bizarre. Je travaille actuellement sur un projet dactylographié avec un ami. Le code est stocké dans un repo github. Nous avons tous deux tiré la même version. Je travaillais bien pour moi et a été aspergé avec des messages d'erreur pour lui. Même système d'exploitation, même version dactylographiée, même version de VisualStudio, ... Il est intéressant de l'erreur a été liée à des modules aussi. Un module qui a été importé semblait être « vide ». Tout le code qui a essayé d'utiliser le contenu de ce module a été marqué en rouge. Il redémarrée VisualStudio et tout d'un coup, le code a été acceptée comme valide. Nous n'avons pas changé quoi que ce soit! Il a compilé sans problème, aussi.

Créé 19/01/2013 à 13:15
source utilisateur

voix
0

Hmm, je ne vois pas de problèmes avec elle, mais ne pas oublier d'initialiser la valeur du champ, sinon le compilateur ne génère pas le terrain:

module MyModule {
    class MyPrivateClass {

    }

    export class MyPublicClass {
        private instance: MyPrivateClass; // MyPrivateClass is unknown
        constructor() {
           this.instance = new MyPrivateClass();
        }
    }
}
Créé 08/10/2012 à 13:40
source utilisateur

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