2

私はそれが何のためにあるのかを理解しています-複合型のエイリアスを定義し、それをドキュメントで使用できることの利点を見ることができます。したがって、次のような型を定義できます...

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

...そしてそれを使用して、次のような関数を文書化します...

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

しかし、私がよくわからないのは、それがドキュメントとコンパイラの静的型チェックにのみ使用されている場合、typedefがJavaScriptのその行を必要とするのはなぜですか?エイリアスは、ドキュメントのコメントブロック内で完全に定義することはできませんか?また、コードを(コンパイルせずに)直接提供した場合、JavaScriptインタープリターはtypedefコメントの後のそのコード行をどのように処理しますか?

4

4 に答える 4

2

コンパイラーはRhinoの上に構築されており、使用可能な構文を拡張するだけです。標準パターンに一致するため、no-opプロパティアクセスからエイリアスを取得する方が簡単だったと思います。

于 2011-08-16T13:07:04.890 に答える
1

実際には、メソッドdocで直接型宣言を設定できます。

/**
 * @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

@typedefいくつかの場所で使用するforオブジェクトタイプを使用する利点は、使いやすさ/明確さです。

例:近いうちに「Point.z」属性を取得する可能性があります。typedefを使用すると、typedef宣言を更新するだけで済み、コードベース全体の各インライン型宣言を更新する必要はありません。

GoogleClosureの@typedefタグの使用も参照してください

于 2011-08-16T11:47:47.657 に答える
0

それは文書化のためだけではありません。また、クロージャコンパイラを使用してスクリプトをコンパイルするときにも警告が表示されます。

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

于 2011-08-15T09:06:04.313 に答える
0

typedef全体がコメントで定義されていればもっと良かったでしょう。その一部をコードとして定義すると、意図しない結果が生じます。このブログ投稿を参照してください。

typedef名が実際のコードで定義されている理由は、ClosureCompilerでの解析と型チェックの動作方法です。パーサーは、各jsdocコメントをASTノードに添付する必要があります。そうしないと、コメントは黙って無視されます。したがって、typedefの名前はコードとして定義され、jsdocがそれに添付され、後でtypecheckerが型定義を取得します。

于 2018-12-24T07:45:36.703 に答える