2016-09-25 5 views
0

私はいつものように、配列またはnull値であるプロパティで、オブジェクトを持っている:なぜGoogleクロージャーコンパイラは配列の長さについて警告しますか?

/** @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プロパティがある場合。この警告を削除/抑制するための提案?

更新: OK、私は馬鹿だった。私は自分のコードベースから問題の最小限の例を準備しようとしましたが、チャドが指摘したように、この例は実際にはコンパイラの警告を投げません。だから私は掘り進んで、配列ではなくオブジェクトとしてプロパティを扱ったコードベースの別の場所を見つけました!

したがって、 'length'プロパティが以前に定義されていなかったという警告は正当なものでした。そして、私はthis.optionalPropertyをowlerとして指摘しておけば、最初にこの混乱が起きることはありませんでした。なぜなら、オブジェクトであるはずのものに配列を代入しようとすると、コンパイラは警告するからです。私はまだコンパイラがブロック内のタイプチェックについてよりスマートになることを維持しています。 if(Array.isArray(something)){} しかし、ここでの問題は間違いなくユーザーエラーでした。

+0

呼ば

閉鎖ウィキは良いページを持っているあなたは、コンパイラの古いバージョンを使用していますか?最近のバージョンでは 'foo.optionalProperty'の型を正しく認識しています。上のテストコードは警告なしで(私はいくつかの変更を加えて)私のために働いていました。 'MyObject'に'/** @constructor */'を、' foo'を正しく定義するために 'var'を追加してください。 –

+0

私は7月14日のコンパイラを使用していました。しかし、9月14日のバージョンに更新されましたが、まだ警告が表示されます。上記のサンプルコードを修正し、欠落しているjsdocと変数の宣言を確認します。 – RobP

答えて

2

あなたは、コンパイラにあなたはまた、そこgoog.isArray()を使用することができ、この

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; 
} 

のようなものを、プロパティのタイプを指示する必要があります。コンパイラがArray.isArrayを認識するかどうかわかりませんが、それは可能性があります。しかし、定義がnullでない場合、それは配列であり、コンパイラはそれを知っています。 Annotating JavaScript for the Closure Compiler

+1

これはお見逃しの機会です.'Array.isArray'チェックで守られたif文の中で、コンパイラは型を強化する可能性があります。 –

+0

@ChadKillingsworth my point正確に。 – RobP

+0

上記の私の更新を参照してください - この答えは、元の投稿にない愚かなコードによって引き起こされたため、コンパイラの警告の理由を実際には説明しません。しかし、ここに示すように変数をタイプすることは、非常に良い習慣であり、上記のダムコードにフラグが立てられているので、私はこの答えを受け入れるか、またはupvoteします。 – RobP

関連する問題