2011-08-15 7 views
2

私はそれが何であるか理解しています。複雑なタイプのエイリアスを定義してドキュメントの中で使用できるという利点が分かります。だから...Googleクロージャのtypedefは実際に何をしていますか?

/** 
* @param {example.Point} point 
* @return {example.Point} 
*/ 
example.functionThatTakesAPointAndReturnsAPoint(point) { 
.... 
} 

しかし、私はよく分からない事を...

/** @typedef {{x:number, y:number}} */ 
example.Point; 

をタイプ何かのように定義し...そして機能を文書化するためにそれを使用して、何かのようにすることができますドキュメントやコンパイラの静的型チェックにしか使われていないのであれば、なぜtypedefにそのJavaScript行が必要なのでしょうか?エイリアスは完全にドキュメントコメントブロック内に定義できませんでしたか?そして、コンパイルせずに直接コードを提供した場合、typedefコメントの後にJavaScriptインタプリタがそのコード行で何をしますか?

答えて

2

を参照してください。私はそれが標準パターンと一致するので、ノーオペレーションのアクセスからエイリアスを取る方が簡単だと思います。

+0

ありがとう - 私はそれが私が探していた情報のようだと思います。そのため、typedefの後のJavaScriptの行は何もしません。そして、それは基本的に便宜のために実装されました。 – IanR

0

これはドキュメント用ではありません。また、クロージャーコンパイラを使用してスクリプトをコンパイルするときにも警告が表示されます。

クロージャコンパイラは、JavaScript 変数に関するデータ型情報を使用して、最適化と警告を強化できます。 JavaScript、 しかし、型を宣言する方法はありません。

+1

ありがとうございます - 私はそのビットを取得...私はちょうどそれを行うには、JavaScriptコードの行が必要な理由についてちょっと混乱していた。なぜ、例えば、typedefは/ ** @typedef {{x:number、y:number}} example.Point * /のようなものではありません。 私はJavaScriptをかなり新しくしていますので、私が正しく理解していないことが起こっていないことを確認したかっただけです。 – IanR

1

あなたが実際にあなたの方法のドキュメントに直接型宣言を設定することができます。あなたはいくつかの場所で使用するオブジェクトタイプのため@typedefを使用しての

/** 
* @param {{x:number, y:number}} pointLike 
*/ 
var myFn = function(pointLike) { 
return pointLike.x + ':' + pointLike.y; 
} 

alert(myFn({x:34, y:20})) 
alert(myFn({x:34, y:'20'})) // will trigger compile time type warning 

利点をユーザビリティ/明瞭によります。

たとえば、まもなくまもなく 'Point.z' attrが表示されます。 typedefを使用すると、コードベース全体のインライン型宣言ではなく、typedef宣言を更新するだけで済みます。

は、コンパイラがサイの上に構築され、単に利用可能な構文を高めている。また、Using Google Closure's @typedef tag

関連する問題