2011-10-25 7 views
2

Googleクロージャコンパイラで遊んでいる間に、間違った変数タイプの警告をコンパイラに強制できない場合がありました。私は次のサンプルを使用しました:Googleクローズコンパイラのタイプアノテーション

そして、期待されるタイプの警告を与えるのではなく、完全にコンパイルします。しかし、あなたが使用する場合:

pending[1] = { 
    name: 'Second Name', 
    toke: 'Second Token' 
} 

予想されるタイプの不一致の警告が表示されます。

pushは組み込み関数なので型チェックが定義されていない可能性が高いと私は理解しています。 pendingを配列pendingItemとして定義すると、それが強制されることが予想されますが、デフォルトではそうではありません。

pushのような既に定義された関数に型チェックを追加することが可能かどうかという問題は、上記の例では警告が出ることです。同様の結果を得る方法の1つは、タイプを強制するためにdummyItemの前に/** @type {pendingItem} */を追加することですが、教育目的のために、タイプチェックをpush(またはより厳密にはpendingという定義にする) 。

また、誰かがオブジェクトプロパティの名前を変更する背後にあるロジックについて説明できますか?上の例をコンパイルすると、dummyItemのプロパティーnameの名前は変更されませんが、tokenからaに変更されます。

答えて

2

pushで強制的にタイプチェックを行うには、正しいタイプのコードで再定義する必要があります。オブジェクトリテラル表記法を使用する場合は、@paramの代わりに@typeを使用して型を定義する必要があります。これは、関数をオブジェクトのパラメータに割り当てているためです。予想されるようにその後の両方が、型の不一致の警告を生成します

// Still an intentionally misspelled "toke" 
var dummyItem = { 
    name: 'NameHere', 
    toke: 'SomeToken' 
}; 

// First warning 
pending.push(dummyItem); 

// Second warning 
pending[1] = { 
    name: 'Second name', 
    toke: 'Second Token' 
}; 

/** @type {function(pendingItem)} */ 
pending.push = function(item) { 
    Array.prototype.push.call(pending, item); 
}; 

さて、次のコンパイルしようとしたとき:この場合は、次のようになります。

今後誰かにとって有用かもしれないと思った。

関連する問題