Как отличить переменные уровня модуля от локальных переменных в TypeScript

Рассмотрим этот модуль:

export module Example{
    let customer : any;

    export function myExample(customer: string) {
        // How to reference the module level customer object here?
        // Is there a standard to make these module level variables Pascal Case to prevent this overlap?
    }
}

customer в функции myExample — это строка. Как мне сослаться на уровень модуля customer?

Если бы это был класс, я мог бы использовать this.customer, но this не работает в модуле, и Example.customer тоже не работает, если клиент не экспортируется...


person Daryl    schedule 29.09.2016    source источник


Ответы (2)


Как правило, модули экспортируют классы, функции или другие элементы, такие как перечисления.

export module Example, как показано в этом примере, указывает только на то, что Example на самом деле является пространством имен, а это означает, что любая ссылка на функцию myExample должна предваряться именем пространства имен, то есть Example.myExample().

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

Трудно предположить, почему вы используете export module вместо export class:

export class Example2 {
    customer: string = 'Example2.customer';
    myExample(customer: string) {
        console.log(`Example ${this.customer}`);
        console.log(`Example ${customer}`);
    }
}

Этот класс фактически является модулем из-за использования ключевого слова export.

person blorkfish    schedule 29.09.2016
comment
Согласно @RyanCavanaugh stackoverflow.com/questions/13255158/ (И это с 2012 года, поэтому с тех пор оно могло измениться) if you are going to have multiple instances of something with data associated with each instance, class is the way to go. If you're just grouping logically-connected sets of stateless functions together, module is more appropriate, Для моего фактического использования этого примера IRL, модули имеют больше смысла. - person Daryl; 29.09.2016
comment
Предоставляется. Так что же тогда делает постоянный клиент? Это не функция без гражданства? Это означает, что вы пытаетесь сгруппировать функцию без сохранения состояния с постоянным значением? - person blorkfish; 30.09.2016
comment
Не знаю, почему это важно. Я изменил его на любой на данный момент. - person Daryl; 30.09.2016

Вот сгенерированная JS версия вопроса TS:

define(["require", "exports"], function (require, exports) {
    "use strict";
    var Example;
    (function (Example) {
        var customer;
        function myExample(customer) {
            // How to reference the module level customer object here?
            // Is there a standard to make these module level variables Pascal Case to prevent this overlap?
        }
        Example.myExample = myExample;
    })(Example = exports.Example || (exports.Example = {}));
});

Поскольку клиент не экспортируется, он создается как частный. И теперь вступают в силу стандартные правила области видимости переменных Javascript, и нет возможности сослаться на клиента на уровне модуля. Самое простое и легкое решение (и IMHO стандартное соглашение для частных переменных уровня модуля) - это подчеркнуть самого внешнего клиента:

export module Example{
    let _customer : any;

    export function myExample(customer: string) {
        _customer = customer;
    }
}
person Daryl    schedule 04.10.2016