JSDocで自由形式の引数関数を文書化する正しい方法


84

次のようなものがあるとしましょう。

var someFunc = function() {
    // do something here with arguments
}

この関数がJSDocで任意の数の引数を取ることができることをどのように正しく文書化しますか?これは私の最善の推測ですが、それが正しいかどうかはわかりません。

/**
 * @param {Mixed} [...] Unlimited amount of optional parameters
 */
var someFunc = function() {
    // do something here with arguments
}

関連:php-可変数のパラメーターを文書化する方法

回答:


119

JSDocの仕様Googleの閉鎖コンパイラは、このようにそれを実行します。

@param {...number} var_args

ここで、「数値」は予想される引数のタイプです。

したがって、これの完全な使用法は次のようになります。

/**
* @param {...*} var_args
*/
function lookMaImVariadic(var_args) {
    // Utilize the `arguments` object here, not `var_args`.
}

追加の引数にアクセスするargumentsための利用(またはのオフセットarguments)に関するコメントに注意してください。var_argsこれは、引数が実際に存在することをIDEに通知するために使用されていました。

ES6のRESTパラメーターは、実際のパラメーターをさらに一歩進めて、提供された値を含めることができます(したがって、これ以上使用するarguments必要はありません)。

/**
* @param {...*} var_args
*/
function lookMaImES6Variadic(...var_args) {
    // Utilize the `var_args` array here, not `arguments`.
}

これはおそらく私たちが得ることができる限り答えに近いです:)
kflorence 2011

2
また、WebStormの内部JSDocファイル(DHTML.jsなど)はこれと同じ構文を使用します。多分それは事実上の標準です。
スコットリッペイ2012

2
ここでも非常によく説明されています:usejsdoc.org/tags-param.html(セクション「パラメーターの繰り返しを許可する」)
Francois

この回答は、エイドリアンホロヴァティの回答を統合するように編集する必要があります。呼び出される実際の変数、var_argsまたは唯一のパラメーターとして呼び出したいものが必要です。悲しいハック。
オリ2015年

1
ES6にrestパラメーターが追加されたことで、これははるかに理にかなっています。/** @param {...Function} tasks The tasks. */ function waterfallTasks(...tasks) {残りのパラメーターは、常にパラメーター内に機能的に存在します。
渋見2016

27

これを行う方法は、JSDocドキュメントで説明されており、Closureドキュメントと同様に省略記号を使用しています。

@param {...<type>} <argName> <Argument description>

省略記号の後に続くタイプを指定する必要がありますが、*を使用して何でも受け入れることを説明したり、|を使用して複数の受け入れ可能なタイプを区切ることができます。生成されたドキュメントでは、JSDocは、オプションの引数をオプションとして説明するのと同じように、この引数を繰り返し可能として説明します

私のテストでは、実際のjavascript関数定義に引数を含める必要がなかったため、実際のコードには空の括弧を含めることができますfunction whatever() { ... }

シングルタイプ:

@param {...number} terms Terms to multiply together

任意のタイプ(以下の例では、角括弧はitemsオプションと繰り返し可能の両方としてタグ付けされることを意味します):

@param {...*} [items] - zero or more items to log.

複数のタイプでは、タイプリストを括弧で囲み、開き括弧の前に省略記号を付ける必要があります。

@param {...(Person|string)} attendees - Meeting attendees, listed as either 
                                        String names or {@link Person} objects

1
そして、キーと値のペアとして使用されるオブジェクトはどうですか?現在私は使用しています:@param {{...(key: value)}} [config] - specific configs for this transferしかし、これが正しいかどうか疑問に思っていましたか?
最大

@Maxそれが公式の正しい方法であるかどうかはドキュメントからはわかりませんが、期待どおりに機能するようです。したがって、問題のない出力が生成される場合は、それを使用します:)
Daniel Baird 2015年

10

JSDocのユーザーグループ

公式の方法はありませんが、考えられる解決策の1つは次のとおりです。

/**
 * @param [...] Zero or more child nodes. If zero then ... otherwise ....
 */

角括弧はオプションのパラメーターを示し、...は(私にとって)「任意の数」を示します。

別の可能性はこれです...

/**
 * @param [arguments] The child nodes.
 */

どちらの方法でも、あなたが何を意味するのかを伝える必要があります。

(2007)少し古いですが、私はそれ以上の最新のものを知りません。

paramタイプを「mixed」として文書化する必要がある場合は、のよう{*}にを使用し@param {*} [arguments]ます。


6
私の答えに反対票を投じてもかまいませんが、なぜあなたがそれをしたのか(あなたが誰であれ)を説明するコメントを期待しています。あなたがそれが間違っていると思うなら、私に-そして私たち全員に-理由を知らせてください。
hashchange 2013

2
私が選んだIDE(WebStorm 8.0.1)は、構文#2 @param [arguments](または@param {*} [arguments]それに関して)とGoogle Closureコンパイラーによって確立された構文(別の回答で言及されている)をサポートしています。@param [...]サポートされていません。
mistaecko 2014

@mistaeckoですが、名前付きパラメーターのみが正しいですか?それは私が使用していないものなので、これは私にとって受け入れられる答えではありません...
セバスチャン

10

私はかなり長い間これに夢中になりました。Google ClosureCompilerでそれを行う方法は次のとおりです。

/**
* @param {...*} var_args
*/
function my_function(var_args) {
    // code that accesses the magic 'arguments' variable...
}

重要なのは、関数が実際にそのパラメーターを使用していなくても、関数にvar_argsパラメーター(または@paramステートメントで呼び出すもの)を与えることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.