繁体   English   中英

为什么Google Closure编译器会警告数组长度?

[英]Why does google closure compiler warn about length of an array?

我有一个对象,其属性始终是数组或空值,如下所示:

/** @constructor */
function MyObject() {
    // optionalProperty always contains an array or null
    this.optionalProperty = null;
}

MyObject.prototype.initialize = function() {
     this.optionalProperty = [1,2,3];
};

var foo = new MyObject();
foo.initialize();

if(Array.isArray(foo.optionalProperty)) {
    var length = foo.optionalProperty.length;
}

Google闭包编译器警告说,即使在执行检查长度的代码行中显然是数组,也永远不会在foo.optionalProperty上定义属性length,并且数组当然具有length属性。 有关消除/抑制此警告的建议?

更新:好的,所以我有点白痴。 我试图从我的代码库中准备一个最小的问题示例,但是正如Chad指出的那样,该示例实际上不会引发编译器警告。 因此,我开始进行挖掘,并在代码库中找到了另一个将属性视为对象而非数组的地方! 这是查看警告的更好的代码片段:

/** @constructor */
function MyObject() {
    // optionalProperty always contains an array or null
    this.optionalProperty = null;
}

MyObject.prototype.initialize = function() {
    this.optionalProperty = {};
    this.optionalProperty.a = 1;
};

MyObject.prototype.otherMethod = function() {
    if(Array.isArray(this.optionalProperty)) {
        for (var i = 0; i < this.optionalProperty.length; i++) {
            console.log(i);
        }
    }
};

var foo = new MyObject();
foo.initialize();
foo.otherMethod();

因此,关于“长度”属性先前未定义的警告是合法的。 而且,如果我输入owler指出的话,我绝对不会一开始就感到困惑,因为如果您尝试将数组分配给应该是对象的对象,编译器会发出警告。 我仍然认为,编译器在if(Array.isArray(something)){}之类的块中进行类型检查可能会更聪明,但是这里的问题肯定是用户错误。

您需要告诉编译器属性的类型,像这样

function MyObject() {
    /** optionalProperty always contains an array or null
    * @type {?Array}
    */
    this.optionalProperty = null;
}

MyObject.prototype.initialize = function() {
     this.optionalProperty = [1,2,3];
}

foo = new MyObject();
foo.initialize();

if (this.optionalProperty != null) {
    var length = foo.optionalProperty.length;
}

您也可以在goog.isArray()使用goog.isArray() 我不知道编译器是否可以识别Array.isArray 但是根据定义,如果它不为null,则它是一个数组,并且编译器知道这一点。

闭包Wiki上有一个名为“ 为闭包编译器注释JavaScript”的好页面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM