jQuery メソッドの多くは、入力パラメーターの数と型に基づいてさまざまな型を返します。この動作は、従来の言語での関数のオーバーロードに似ています。ただし、JavaScript は従来の関数のオーバーロードをサポートしておらず、jQuery は関数の引数を調べることで動作を模倣しています。
の場合.val
、関数のオーバーロードがサポートされている場合、メソッドにどのように注釈が付けられるかを次に示します。
/** @return {number|string|Array.<string>} */
jQuery.prototype.val = function() {};
/**
* @param {number|string|Array.<string>|function(number, *)} newVal
* @return {!jQuery}
*/
jQuery.prototype.val = function(newVal) {};
関数のオーバーロードがないため、 の実際のシグネチャ.val
は両方の用途を組み合わせたものになります。
/**
* @param {(number|string|Array.<string>|function(number, *))=} newVal
* @return {!jQuery|number|string|Array.<string>|function(number, *)}
*/
jQuery.prototype.val = function(newVal) {};
このため、 の戻り値を.val
への別の呼び出しの入力として使用する.val
場合は、元の戻り値を型キャストして、予想される使用方法を指定する必要があります。
$("#MySelect").val(
/** @type {number|string|Array.<string>} */
($("#MySelect option:first").val()) //note the extra parens
);
この動作は、jQuery externs ファイルの上部にあるコメントで説明されています: http://code.google.com/p/closure-compiler/source/browse/trunk/contrib/externs/jquery-1.7.js#20