私はいつものように、配列または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)){} しかし、ここでの問題は間違いなくユーザーエラーでした。
呼ば
閉鎖ウィキは良いページを持っているあなたは、コンパイラの古いバージョンを使用していますか?最近のバージョンでは 'foo.optionalProperty'の型を正しく認識しています。上のテストコードは警告なしで(私はいくつかの変更を加えて)私のために働いていました。 'MyObject'に'/** @constructor */'を、' foo'を正しく定義するために 'var'を追加してください。 –
私は7月14日のコンパイラを使用していました。しかし、9月14日のバージョンに更新されましたが、まだ警告が表示されます。上記のサンプルコードを修正し、欠落しているjsdocと変数の宣言を確認します。 – RobP