JSDoc:如何记录具有动态和固定属性混合的对象?

时间:2019-05-06 07:32:44

标签: javascript comments jsdoc

假设我有一个像这样的函数:

function validator(obj){
  const ret = {};

  for (const key in obj){
    // Returns a boolean
    result = validate(key, obj[key]);

    if (result !== true)
      ret.error = true;

    ret[key] = result;
  }

  return ret;
}

此函数将返回一个对象,根据传递给该函数的参数动态填充对象的内容。

我可以这样记录功能:

/**
 * @param {Object.<string, *>} obj
 * @returns {Object.<string, boolean>}
 */

但是它没有记录动态.error属性,该属性也会返回布尔值。

如果全部返回,我可以简单地写:

/**
 * @param {Object.<string, *>} obj
 * @returns {{error: boolean}}
 */

但是它现在没有记录动态属性。

我能想到的是这样的:

/**
 * @param {Object.<string, *>} obj
 * @returns {Object.<string, boolean>|{error: boolean}}
 */

虽然可以使用,但对我来说在语法上似乎不正确。我不能使用@typedef,因为当我已经知道要使用什么属性时就应该使用它。

JSDoc's documentation中找不到关于此问题的任何信息。

那么如何记录具有动态和固定属性混合的对象?

1 个答案:

答案 0 :(得分:2)

你可以用模板来做到这一点

/**
 * @template {Object<string,any>} T
 * @param {T} obj
 */
function validator(obj){
    /** @type {T & {error?: Boolean}} */
    const ret = {};
  
    for (const key in obj){
      // Returns a boolean
      const result = validate(key, obj[key]);
  
      if (result !== true)
        ret.error = true;
  
      ret[key] = result;
    }
  
    return ret;
  }

代码补全示例

Code completion