【问题标题】:Google Closure Compiler, Handling JSC_INEXISTENT_PROPERTY warningGoogle Closure 编译器,处理 JSC_INEXISTENT_PROPERTY 警告
【发布时间】:2023-03-03 20:28:02
【问题描述】:

如何消除通过 Google Closure Compiler Advance 模式运行以下代码时出现的警告?

var defaults = {
    team : 'ABC',
    wr:  'Calvin',
    qb: 'Manning'
};

var config = {};

var setters = {
    team : function(){ return defaults.team},
    wr : function(){ return defaults.wr}
};

for(var i in setters){
    config[i] = setters[i].call();
}


alert( config.team);
alert( config.wr);

警告数:2

JSC_INEXISTENT_PROPERTY: Property team never defined on config at line 19 character 7
alert(config.team);

   ^
 JSC_INEXISTENT_PROPERTY: Property wr never defined on config at line 20 character 7
 alert(config.wr);


   ^

【问题讨论】:

    标签: javascript google-closure-compiler bundling-and-minification google-closure-library


    【解决方案1】:

    找到了。

    @lends 可以解决问题。

    lends tag

    var defaults = {
        team : 'ABC',
        wr:  'Calvin',
        qb: 'Manning'
    };
    var config = {};
    
    
    var setters = 
    /** @lends {config} */
    {
        team : function(){ return defaults.team},
        wr : function(){ return defaults.wr}
    };
    
    for(var i in setters){
        config[i] = setters[i].call();
    }
    
    
    alert(config.team);
    alert(config.wr);
    

    【讨论】:

      【解决方案2】:

      我猜你应该用 null 值定义这些属性,这样编译器就会知道。

      var config = {
          team: null,
          wr: null
      };
      

      建议 2(我不确定):尝试注释配置类型。像这样的:

      /** @type {{team: *, wr: *}} */
      var config = {};
      

      使用克隆:

      var config = goog.object.clone(setters);
      goog.object.forEach(config, function(val, key) {
          config[key] = val.call();
      });
      

      【讨论】:

      • 谢谢。问题是 config 有超过 75 个属性,使用第一种技术会很麻烦。同样适用于第二个
      • config['team'] 方法怎么样?
      【解决方案3】:

      作为替代方案,您可以将类型注释为更通用:

      /** @type {Object} */  var config = {};  // allow any prop defined anywhere on any object.
      

      或更具体:

      /** @type {{team:(string|undefined), wr:(string|undefined), qb:(string|undefined)}} */  var config = {};  // "team", "wr" and "qb" are expected.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        • 1970-01-01
        相关资源
        最近更新 更多