私はjsdocでコールバックを適切に文書化するための最良の方法を探すためにインターネットを探し回ってかなり長い時間を費やしましたが、残念ながら、私はまだすばらしいものを見つけていません。
ここに私の質問があります:
開発者向けにNode.jsライブラリを作成しています。このライブラリは、開発者が作業する複数のクラス、関数、およびメソッドを提供します。
コードを明確で理解しやすくするために、また(できれば)将来的にいくつかのAPIドキュメントを自動生成するために、コードで jsdoc を使用して、何が起こっているのかを自己文書化しました。
次のような関数を定義するとしましょう。
function addStuff(x, y, callback) {
callback(x+y);
});
現在、jsdocを使用して、この関数を次のように文書化しています。
/**
* Add two numbers together, then pass the results to a callback function.
*
* @function addStuff
* @param {int} x - An integer.
* @param {int} y - An integer.
* @param {function} callback - A callback to run whose signature is (sum), where
* sum is an integer.
*/
function addStuff(x, y, callback) {
callback(x+y);
});
コールバック関数が受け入れるものを絶対的に指定する方法がないため、上記の解決策はちょっとハック的な感じがします。
理想的には、私は次のようなことをしたいです:
/**
* Add two numbers together, then pass the results to a callback function.
*
* @function addStuff
* @param {int} x - An integer.
* @param {int} y - An integer.
* @param {callback} callback - A callback to run.
* @param {int} callback.sum - An integer.
*/
function addStuff(x, y, callback) {
callback(x+y);
});
上記は、コールバックが受け入れる必要があるものをより簡単に伝えることができるように思えます。それは理にかなっていますか?
私の質問は簡単だと思います:jsdocでコールバック関数を明確に文書化する最良の方法は何ですか?
お時間をいただきありがとうございます。
JSDoc 3には、まさにこの目的のために @ callback tag があります。以下に使用例を示します。
/**
* Callback for adding two numbers.
*
* @callback addStuffCallback
* @param {int} sum - An integer.
*/
/**
* Add two numbers together, then pass the results to a callback function.
*
* @param {int} x - An integer.
* @param {int} y - An integer.
* @param {addStuffCallback} callback - A callback to run.
*/
function addStuff(x, y, callback) {
callback(x+y);
}
別の可能性は、この方法でコールバックに渡される値を記述することです:
_/**
* Add two numbers together, then pass the results to a callback function.
*
* @function addStuff
* @param {int} x - An integer.
* @param {int} y - An integer.
* @param {function(int)} callback - A callback to run whose signature is (sum), where
* sum is an integer.
*/
function addStuff(x, y, callback) {
callback(x+y);
});
_
コールバックの戻り値の型を文書化するには、@param {function(int):string}
を使用します。
VSCodeに理解させるための回避策
/**
* @typedef {function(FpsInfo)} fpsCallback
* @callback fpsCallback
* @param {FpsInfo} fps Fps info object
*/
/**
* @typedef {Object} FpsInfo
* @property {number} fps The calculated frames per second
* @property {number} jitter The absolute difference since the last calculated fps
* @property {number} elapsed Milliseconds ellapsed since the last computation
* @property {number} frames Number of frames since the last computation
* @property {number} trigger Next computation will happen at this amount of frames
*/
/**
* FPS Meter - Returns a function that is used to compute the framerate without the overhead of updating the DOM every frame.
* @param {fpsCallback} callback Callback fired every time the FPS is computed
* @param {number} [refreshRate=1] Refresh rate which the fps is computed and the callback is fired (0 to compute every frame, not recommended)
* @returns {function} Returns a function that should be called on every the loop tick
* @author Victor B - www.vitim.us - github.com/victornpb/fpsMeter
*/
function createFpsMeter(callback, refreshRate = 1) {
// ...
}