【问题标题】:jsdoc @typedef - how to declare function properly?jsdoc @typedef - 如何正确声明函数?
【发布时间】:2020-03-12 04:17:40
【问题描述】:

这是我的 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
  };
};

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

目前 - 这是我收到的:

我希望我的 IDE 将 MyNewType.logFirstlogFirst 定义绑定。

【问题讨论】:

    标签: javascript function jsdoc


    【解决方案1】:

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

    在 JSDoc 中没有像 @typedef {MyNewType} MyNewType 这样的东西,而是 @typedef {Object} MyNewType(定义基本类型)(see docs

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

    最后但同样重要的是,没有冒犯,但赞成的解决方案也是错误的,因为它混淆了 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
        };
    };
    

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

    【讨论】:

    • 请注意,“[at]typedef Function”与“[at]callback”相同(根据文档)-文档是否在某处明确提及? vscode 在智能感知方面似乎并不相同,所以只是想确认一下
    【解决方案2】:

    以防万一它对任何人有帮助,因为 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
        };
    };
    

    这对我们来说效果很好。

    【讨论】:

    • 你的 typedef 不应该是@typedef {function} MyNewType吗? MyNewType 未在 typedef 声明之前定义,因此不能用作类型。之后,在不同的 typedef 中,它可能是。
    猜你喜欢
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多