web-dev-qa-db-ja.com

jsdoc @ typedef-関数を正しく宣言する方法は?

これが私のjsdoc宣言です。

MyNewType.logFirstプロパティが実際にlogFirst関数を参照するように、どのように調整する必要がありますか。これについては、以下で注釈を付けます。

// my-new-type.js
/**
 * MyNewType definition
 * @typedef {Object} MyNewType
 * @property {function} logFirst
 * @property {function} logSecond
 */

/**
 * @param {number} first
 * @param {number} second
 * @returns MyNewType
 */
module.exports = (first, second) => {
  /**
   * logs first argument
   * @param {number} times
   */
  function logFirst(times) {
    for (let i = 0; i < times; i++) {
      console.log(first);
    }
  }

  /**
   * logs second argument
   * @param {number} times
   */
  function logSecond(times) {
    for (let i = 0; i < times; i++) {
      console.log(second);
    }
  }

  return {
    logFirst,
    logSecond
  };
};

このような「工場」構造を維持することが重要です。

現在-これは私が受け取るものです: enter image description here

IDEにMyNewType.logFirstlogFirst定義にバインドさせたい。

4
Pavel Polyakov

それが誰かを助ける場合に備えて、OPは私の同僚です:

    // my-new-type.js
/**
 * MyNewType definition
 * @typedef {MyNewType} MyNewType
 * @param {number} first
 * @param {number} second
 * @property {function} logFirst
 * @property {function} logSecond
 * @returns MyNewType
 */

var MyNewType = module.exports = (first, second) => {
    /**
     * logs first argument
     * @typedef {number} logFirst
     * @param {number} times
     */
    function logFirst(times) {
        for (let i = 0; i < times; i++) {
            console.log(first);
        }
    }

    /**
     * logs second argument
     * @param {number} times
     */
    function logSecond(times) {
        for (let i = 0; i < times; i++) {
            console.log(second);
        }
    }

    return {
        logFirst,
        logSecond
    };
};

これは私たちにとってうまくいきました。

5
ProllyGeek

私が間違っていない限り、賛成の解決策がどのように機能するかはわかりません。

JSDocには@typedef {MyNewType} MyNewTypeのようなものはありませんが、@typedef {Object} MyNewType(基本型を定義するため)( ドキュメントを参照

また、特定のソリューションでは注釈がすべて混同されています。たとえば、@paramは関数パラメーター専用であり、特殊な関数タイプを宣言する場合( ドキュメントを参照

最後に大事なことを言い忘れましたが、var MyNewType型宣言(2つのパラメーターを持ち、2つのプロパティを持つオブジェクトを返す関数)と実際の戻り値宣言(2つのプロパティ)が混同されているため、違反はありませんが、賛成の解決策も間違っています。上記のオブジェクトの)。返されるタイプの周りに必要な括弧が含まれていないことに加えて。

編集:ああ、私はlogFirstではなくnumberではなくFunctionであることを忘れました。 OPの同僚によって提案されました。

なぜ人々がそのような壊れた解決策に賛成するのか私は本当に理解できません...

JSDocの専門家ではありませんが、次の解決策ですべてを修正する必要があると思います、新しいSO訪問者) :

(注:logFirst関数とlogSecond関数はまったく同じ署名を持っているため、2つの異なるtypedefが必要になる理由はわかりませんが、JFFは両方を指定しました)

/**
 * Declare our "logFirst" type (which is a function)
 *
 * @callback TypeFnLogFirst
 * @param {number} times
 * @returns {void}
 */

/**
 * Declare our "logSecond" type (which is a function)
 *
 * @callback TypeFnLogSecond
 * @param {number} times
 * @returns {void}
 */

/**
 * Declare our returned type
 * 
 * @typedef {Object} TypeObjTwoFns
 * @property {TypeFnLogFirst} logFirst
 * @property {TypeFnLogSecond} logSecond
 */

/**
 * Declare our "MyNewType" type (which is a function)
 *     with two parameters
 *     and a return value (object literal of type TypeObjTwoFns)
 *     (==> where the magic happens)
 * Note that "[at]typedef Function" is the same as "[at]callback" (as per the docs)
 *
 * @typedef {Function} TypeFnNewType
 * @param {*} first
 * @param {*} second
 * @returns {TypeObjTwoFns}
 */

/** @type {TypeFnNewType} MyNewType */
var MyNewType = (first, second) => {
    /** @type {TypeFnLogFirst} logFirst */
    function logFirst(times) {
        for (let i = 0; i < times; i++) {
            console.log(first);
        }
    }

    /** @type {TypeFnLogSecond} logSecond */
    function logSecond(times) {
        for (let i = 0; i < times; i++) {
            console.log(second);
        }
    }

    return {
        logFirst,
        logSecond
    };
};

ソース: JSDoc typedef、callback、param および JSDoc member、var、type

0
Lideln Kyoku