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

Мне нравится, как компилятор 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?


person thesmart    schedule 27.10.2010    source источник


Ответы (2)


Мое предложение состояло бы в том, чтобы просто аннотировать параметр как {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']);
} 
person Derek Slager    schedule 28.10.2010
comment
Спасибо! Я пытался решить ту же проблему, и это сработало. Но я не уверен, что понимаю, почему компилятор запутывает имена свойств, когда используется запись через точку, но не когда используется запись с квадратными скобками. Я знаю, что запись с квадратными скобками допускает использование переменных, но не будет ли компилятор их запутывать? - person Rob Flaherty; 05.11.2010
comment
Зачем менять параметр на Object? Его определение типа было в порядке, все, что ему нужно было сделать, это либо объявить внешний вид, либо использовать строковый литерал: config['id'] вместо config.id. Удаление правильного определения типа означает, что если бы он когда-либо вызывал функцию из своего скомпилированного кода, у него не было бы никакой проверки типов. Сбивает с толку, нет? - person EMMERICH; 01.03.2011
comment
Мое понимание аннотации заключается в том, что она используется людьми, чтобы понять метод, очень похожий на более элегантную строку комментария. Что еще более важно, это позволяет Google выдавать ошибки, если этот метод использовался неправильно. - person Justin Bull; 24.05.2011

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

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

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

Об объектах конфигурации

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

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

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

person Stephen Chung    schedule 10.03.2011