如何使用Google Closure Compiler声明动态属性?

时间:2013-09-02 20:40:56

标签: javascript google-closure-compiler jsdoc

/**
 * @param {Object} object
 * @param {(string|number)} name
 * @param {*} value
 */
var fabric = function(object, name, value) {
    object[name] = value;
};


fabric(Number, 'MAX_INTEGER', 9007199254740991);
// ...

console.log(Number.MAX_INTEGER); // 9007199254740991

警告:JSC_INEXISTENT_PROPERTY:从未在Number上定义属性MAX_INTEGER     第14行第12行

如何在没有预定义的情况下声明动态属性?

UPD:

数[ 'MAX_INTEGER'];

2 个答案:

答案 0 :(得分:3)

这属于文档的Restrictions for ADVANCED_OPTIMIZATIONS。您必须使用点分表示法或带引号的语法始终引用属性。混合访问时,编译器可能会重命名虚线访问,但不会触及引用的语法,从而生成错误的代码。

答案 1 :(得分:1)

如果您确实想以这种方式添加属性,您有两种选择:

在externs中添加一个存根声明(这将阻止重命名):

/** @const {number} */
Number.MAX_INTEGER;

或将@lends与对象文字一起使用:

/**
 * @param {Object} object
 * @param {Object} props
 */
var fabric2 = function(object, props) {
  for (var prop in props) {
    object[prop] = props[prop];
  }
};

fabric2(Number, /** @lends {Number} */ { MAX_INTEGER: 9007199254740991 });