Anteriormente, sempre documentei meus parâmetros de objeto da seguinte maneira:
/**
* 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
}
Mas não tenho certeza de qual é a melhor abordagem com o parâmetro de função desestruturada. Devo apenas ignorar o objeto, defini-lo de alguma forma ou qual é a melhor maneira de documentá-lo?
/**
* Description of the function
*
* @param {String} foo
* @param {Boolean} [bar] - Optional value
* @return {String}
*/
function doSomething ({ foo, bar } = {}) {
console.log(foo, bar);
// do something
}
Acho que minha abordagem acima não deixa óbvio que a função espera um object
e não dois parâmetros diferentes.
Outra maneira que eu poderia imaginar seria usando @typedef
, mas isso pode acabar sendo uma grande bagunça (especialmente em um arquivo maior com muitos métodos)?
/**
* @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
}
arguments
ecmascript-6
jsdoc
destructuring
Morkro
fonte
fonte
config
em seu código ou se tem algum nome.foo
ebar
. Não é uma solução final, mas qualquer abordagem usando um objeto gerou erros de inspeção - e inspeções e preenchimentos automáticos do IDE é o que mais me preocupa.Respostas:
É assim que se pretende, conforme descrito na documentação .
/** * 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 }
Portanto, seu primeiro exemplo está bastante correto.
Outro exemplo com alguns aninhamentos mais profundos:
/** * 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;
fonte
function ({a}, {a}) {}
. O JSDoc eu acho que seria@param {object} param1, @param {*} param1.a, @param {object} param2, @param {*} param2.a
, e confio na ordem das@param
tags?function ({a}, {a}) {}
é uma sintaxe inválida, poisa
é definida duas vezes aqui.({a: b}, {a}))
ou({a}, {b})
- o ponto era que as@param
tags JSDoc são AFAIK sem ordem e as chaves podem ser ambíguas se o JSDoc tentar fazer a correspondência usando nomes de propriedade. A próxima versão do VSCode usará pesquisa posicional para resolver esse cenário.Eu pessoalmente uso este:
/** * @param {{ a: number b: number }} param0 * @returns {number} The sum */ const func = ({ a, b }) => a + b;
Basta criar o objeto bem aqui.
Eu também aproveito o TypeScript e declaro opcional
b
comob?
oub: number | undefined
porque o JSDoc também permite uniõesfonte
Consulte "Documentando as propriedades de um parâmetro" do 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) { // ... };
(A verificação de tipo de compilador do Google Closure , que foi baseada em, mas desviada do JSDoc, também permite
@param {{x:number,y:number}} point A "point-shaped" object.
)fonte
employee
variável na função.Project.prototype.assign = function({ name, department })
. Antes do exemplo, eles dizem: "Se um parâmetro for desestruturado sem um nome explícito, você pode dar ao objeto um nome apropriado e documentar suas propriedades."