jsdoc @typedef - 如何正确声明函数?

Pav*_*kov 12 javascript function jsdoc

这是我的 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
  };
};
Run Code Online (Sandbox Code Playgroud)

重要的是,我们保持这种“工厂”结构。

目前 - 这是我收到的: 在此处输入图片说明

我希望我的 IDEMyNewType.logFirstlogFirst定义绑定。

Lid*_*oku 15

除非我弄错了,否则我看不到赞成的解决方案是如何工作的。

@typedef {MyNewType} MyNewTypeJSDoc 中没有什么,而是@typedef {Object} MyNewType(定义基本类型)(参见文档

此外,注释在给定的解决方案中都混在一起了。例如,@param仅用于函数参数和声明专用函数类型时(请参阅文档

最后但并非最不重要的一点是,没有冒犯,但赞成的解决方案也是错误的,因为它混淆了 var MyNewType类型声明(具有两个参数的函数并返回具有两个属性的对象)和实际返回值声明(所述对象的两个属性) . 除了不包括返回类型周围所需的括号。

编辑:哦,我忘了logFirst不是一个number而是Function,这是由OP的同事提出了解决另一个错误。

我真的无法理解为什么人们会赞成这样一个破碎的解决方案......

绝不是 JSDoc 的专家,但是我认为以下解决方案应该解决所有问题,对于新的 SO 访问者:

(注意:我不明白为什么我们需要两个不同的 typedef 用于 logFirst 和 logSecond 函数,因为它们具有完全相同的签名,但是 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
    };
};
Run Code Online (Sandbox Code Playgroud)

来源:JSDoc typedef,callback,paramJSDoc member,var,type


Pro*_*eek 4

以防万一它对任何人有帮助,因为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
    };
};
Run Code Online (Sandbox Code Playgroud)

这对我们来说效果很好。

  • 你的 typedef 不应该是 `@typedef {function} MyNewType` 吗?MyNewType 未在 typedef 声明之前定义,因此它不能用作类型。后来,在不同的 typedef 中,它可能是这样。 (3认同)