Лучший способ определить объект конфигурации с помощью Google Closure - PullRequest
1 голос
/ 27 октября 2010

Мне нравится, как компилятор Google Closure оптимизирует символы в коде.Однако я не нашел хорошего способа определения общедоступных экспортируемых функций, которые принимают объекты конфигурации в качестве параметров.Рассмотрите этот фрагмент кода:

goog.provide('foo');
goog.require('goog.dom');

/** @typedef {{
 *              id : string,
 *              clazz : string
 *           }}
 */
foo.config;

/**
 * Does some neat stuff
 * @param {foo.config} config
 */    
foo.myFoo = function(config) {
    var el = goog.dom.getElement(config.id);
    goog.dom.classes.add(el, config.clazz);
} 
goog.exportSymbol('foo.myFoo', foo.myFoo);

Теперь предположим, что мы загружаем этот скрипт и хотим вызвать myFoo следующим образом:

<script type="text/javascript">
foo.myFoo({
    id: 'unique-id',
    clazz: 'pretty'
});
</script>

Если скомпилировано, это не будет выполнено, поскольку свойства id и clazzсжат.

Кто-нибудь знает элегантный способ реализации и экспорта объектов конфигурации с помощью компилятора Google Closure?

Ответы [ 2 ]

1 голос
/ 10 марта 2011

В отношении конфликтов искаженных и необработанных имен свойств

Вам придется либо:

  • "extern" ваши имена свойств (чтобы они не были переименованы)
  • используйте "обозначения в скобках" для доступа к свойствам

Относительно объектов конфигурации

Согласно документации по Closure Compiler, в настоящее время вы не можете этого сделать. Вы должны пометить параметр как объект.

Вы можете определить тип, но это не поможет вам, потому что тип требует все свойств для существования, но вы можете установить только несколько параметров в объекте конфигурации .

Документация по Closure Compiler рекомендует пометить параметр как Object, но задокументировать поля в комментариях.

1 голос
/ 28 октября 2010

Я бы предложил просто аннотировать параметр как {Object} и заключить в кавычки ключи, как показано ниже:

foo.myFoo({
    'id': 'unique-id',
    'clazz': 'pretty'
});

...

/**
 * Does some neat stuff
 * @param {Object} config
 */    
foo.myFoo = function(config) {
    var el = goog.dom.getElement(config['id']);
    goog.dom.classes.add(el, config['clazz']);
} 
...