только сделать класс видимым внутри модуля: машинопись

голоса
9

Посмотрите на следующий код:

module MyModule {
    class MyPrivateClass {
        ...
    }

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

Я хочу MyPrivateClass быть видны только внутри MyModule , в частности , для внутреннего использования в MyPublicClass . Вне MyModule , только MyPublicClass должен быть виден. Я полагал , что выше макет должен делать , но VS жалуется , что MyPrivateClass не виден внутри MyPublicClass . Добавление экспорта до определения MyPrivateClass делает его видимым для MyPublicClass но это также видно снаружи.

Есть ли способ , чтобы сделать его видимым для MyPublicClass только?

Спасибо.

Задан 08/10/2012 в 13:28
источник пользователем
На других языках...                            


4 ответов

голоса
7

Вот рабочий пример, который показывает частный класс, открытый класс, используя частный класс от общественного класса и пытаются использовать частный класс, который генерирует сообщение об ошибке.

Если вы все еще получаете сообщение об ошибке, вы в состоянии раскрыть имя, которое вы пытаетесь использовать для модуля, который вызывает проблему?

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
Ответил 12/10/2012 в 17:32
источник пользователем

голоса
2

Если вы хотите, чтобы быть рядовым в испускается JavaScript вы можете сделать это путем перемещения экземпляра частных CLAs внутрь модуля, но не в сторону экспортируемого класса.

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();
Ответил 03/01/2013 в 17:39
источник пользователем

голоса
0

Вы сказали, что в одном из ваших комментариев:

Это странно: если я вставляю код, как описано выше (ваш или мой), это нормально. Но как только я изменить имя модуля для его реального имени, ошибка я описал появляется

Это звучит очень похоже на проблемы я испытал. Это было вызвано тем, что я использовал различные пути ссылок, чтобы импортировать модули. В результате внутри элементов модуля не могут получить доступ друг к другу.

Мне очень жаль, но я не могу вспомнить никаких подробностей, и я не был в состоянии воспроизвести вашу (или мой) ошибку. Это, вероятно, бесполезно, но я думал, что я хотел бы поделиться своим опытом, тем не менее: Смешение пути ссылок и модули, кажется, вызывает очень странные ошибки.

Кроме того, иногда VisualStudio ведет себя довольно странно. Я сейчас работаю над проектом машинописи вместе с другом. Код хранится в GitHub репо. Мы оба вытащили ту же версию. Я работал хорошо для меня и посыпаю сообщения об ошибках для него. То же ОС, такая же версия машинопись, той же версии VisualStudio, ... Интересно, что ошибка была связана с модулями, тоже. Модуль, который был импортирован, казалось, «пустой». Весь код, который пытался использовать содержание этого модуля был отмечен красным цветом. Он перезапущен VisualStudio и вдруг, код был принят действительным. Мы ничего не изменили! Составлен без проблем тоже.

Ответил 19/01/2013 в 13:15
источник пользователем

голоса
0

Хм, я не вижу никаких проблем с ним, но не забудьте инициализировать значение поля, в противном случае компилятор не будет генерировать поле:

module MyModule {
    class MyPrivateClass {

    }

    export class MyPublicClass {
        private instance: MyPrivateClass; // MyPrivateClass is unknown
        constructor() {
           this.instance = new MyPrivateClass();
        }
    }
}
Ответил 08/10/2012 в 13:40
источник пользователем

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