1

我喜欢 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 编译器实现和导出配置对象的优雅方式?

4

2 回答 2

1

我的建议是简单地将参数注释为{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']);
} 
于 2010-10-28T00:43:30.327 回答
1

关于损坏和原始属性名称的冲突

您必须:

  • “extern”你的属性名称(这样它们就不会被重命名)
  • 使用“括号表示法”访问属性

关于配置对象

根据 Closure Compiler 文档,目前你不能这样做。您必须将参数标记为对象。

可以定义一个类型,但它对你没有帮助,因为一个类型需要所有的属性都存在,但你可以只在配置对象中设置几个参数。

Closure Compiler 文档建议您将参数标记为 Object,但在注释中记录字段。

于 2011-03-10T13:23:30.393 回答