JSDoc中的文档分解功能参数


89

以前,我总是记录我的对象参数,如下所示:

/**
 * Description of the function
 *
 * @param {Object} config - The configuration
 * @param {String} config.foo
 * @param {Boolean} [config.bar] - Optional value
 * @return {String}
 */
function doSomething (config = {}) {
  const { foo, bar } = config;
  console.log(foo, bar);
  // do something
}

但是我不确定使用分散的函数参数最好的方法是什么。我只是忽略对象,以某种方式定义它还是记录它的最佳方法是什么?

/**
 * Description of the function
 *
 * @param {String} foo
 * @param {Boolean} [bar] - Optional value
 * @return {String}
 */
function doSomething ({ foo, bar } = {}) {
  console.log(foo, bar);
  // do something
}

我感觉上面的方法并没有使函数期望一个object且不是两个不同的参数。

我可以想到的另一种方法是使用@typedef,但是最终可能会变得一团糟(尤其是在具有许多方法的更大文件中)?

/**
 * @typedef {Object} doSomethingConfiguration
 * @property {String} foo
 * @property {Boolean} [bar] - Optional value
 */

/**
 * Description of the function
 *
 * @param {doSomethingConfiguration}
 * @return {String}
 */
function doSomething ({ foo, bar } = {}) {
  console.log(foo, bar);
  // do something
}

1
我认为第一种方法还是可以的。没人关心对象是config在您的代码中命名还是具有任何名称。
Bergi 2016年

在WebStorm中,我发现,如果仅描述(解构后)参数,而忽略解构,则除了很少见的情况外,大多数情况下都可以使用。因此,在您的示例中,描述两个参数foobar。这不是最终的解决方案,但是任何使用对象的方法都会产生检查错误-我最关心的是来自IDE的检查和自动完成。
Mörre

Answers:


96

文档中所述,这就是它的意图。

/**
 * My cool function.
 *
 * @param {Object} obj - An object.
 * @param {string} obj.prop1 - Property 1.
 * @param {string} obj.prop2 - Property 2.
 */
var fn = function ({prop1, prop2}) {
  // Do something with prop1 and prop2
}

因此,您的第一个示例非常正确。

另一个具有更深层嵌套的示例:

/**
 * Nesting example.
 *
 * @param {object} param
 * @param {number} param.a - First value
 * @param {object} param.b - Wrapper
 * @param {number} param.b.c - Second value
 * @return {number} sum a and b
 */
letters = ({a, b: {c}}) => a + c;

当您有多个分解后的参数(例如)时,我看不出JSDoc如何工作function ({a}, {a}) {}。我猜是JSDoc @param {object} param1, @param {*} param1.a, @param {object} param2, @param {*} param2.a,并且依赖@param标签的顺序?
ZachB '18

@ZachB:function ({a}, {a}) {}语法无效,因为a在那里定义了两次。
Cerbrus

1
哎呀。({a: b}, {a}))({a}, {b})-指出JSDoc@param标签是无序的AFAIK,并且如果JSDoc尝试使用属性名称进行匹配,则键可能是不明确的。VSCode的下一版本将使用位置查找来解决这种情况。
ZachB

1
谢谢@ d0gb3r7。我已经更新了答案中的链接。
Cerbrus


-8

请参阅JSDoc的“记录参数的属性”

/**
 * Assign the project to an employee.
 * @param {Object} employee - The employee who is responsible for the project.
 * @param {string} employee.name - The name of the employee.
 * @param {string} employee.department - The employee's department.
 */
Project.prototype.assign = function(employee) {
    // ...
};

Google Closure编译器类型检查(基于JSDoc但从JSDoc转移过来,也允许@param {{x:number,y:number}} point A "point-shaped" object.))


2
他不是已经这样做了吗?他正在问现在该做什么,因为employee该函数中不再有变量。
Bergi 2016年

7
这不能回答问题-此示例不使用解构!通过解构,您没有父对象。
Mörre

实际上,与他的链接相同,在他的示例之后给出了一个相对示例,该示例具有与相同的jsdoc注释Project.prototype.assign = function({ name, department })。在该示例之前,他们说:“如果在没有显式名称的情况下对参数进行了结构分解,则可以为对象指定一个适当的参数并记录其属性。”
notacouch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.