javascript - Hvordan beskrive "object"-argumenter i jsdoc?
// My function does X and Y.
// @params {object} parameters An object containing the parameters
// @params {function} callback The callback function
function(parameters, callback) {
}
Men hvordan beskriver jeg hvordan parameterobjektet skal struktureres? For eksempel bør det være noe som:
{
setting1 : 123, // (required, integer)
setting2 : 'asdf' // (optional, string)
}
Svar #1
Fra @param wiki-siden:
Parametere med egenskaper
Hvis det forventes at en parameter har en bestemt egenskap, kan du dokumentere det umiddelbart etter @param-taggen for den parameteren, slik:
/**
* @param userInfo Information about the user.
* @param userInfo.name The name of the user.
* @param userInfo.email The email of the user.
*/
function logIn(userInfo) {
doLogIn(userInfo.name, userInfo.email);
}
Det pleide å være en @config-tag som umiddelbart fulgte den tilsvarende @param, men den ser ut til å ha blitt foreldet (eksempel her).
Svar #2
Per nå finnes det 4 forskjellige måter å dokumentere objekter som parametere/typer på. Hver av dem har sine egne bruksområder. Bare 3 av dem kan imidlertid brukes til å dokumentere returverdier.
For objekter med et kjent sett av egenskaper (Variant A)
/**
* @param {{a: number, b: string, c}} myObj description
*/
Denne syntaksen er ideell for objekter som kun brukes som parametere for denne funksjonen og ikke krever ytterligere beskrivelse av hver egenskap. Den kan også brukes for @returns.
For objekter med et kjent sett av egenskaper (Variant B)
Veldig nyttig er syntaksen for parametere med egenskaper:
/**
* @param {Object} myObj description
* @param {number} myObj.a description
* @param {string} myObj.b description
* @param {} myObj.c description
*/
Denne syntaksen er ideell for objekter som kun brukes som parametere for denne funksjonen og som krever ytterligere beskrivelse av hver egenskap. Dette kan ikke brukes for @returns.
For objekter som skal brukes på mer enn ett sted i kilden
I dette tilfellet er en @typedef veldig nyttig. Du kan definere typen på ett sted i koden din og bruke den som en type for @param eller @returns eller andre JSDoc-tagger som kan bruke en type.
/**
* @typedef {Object} Person
* @property {string} name how the person is called
* @property {number} age how many years the person lived
*/
Du kan deretter bruke dette i en @param-tag:
/**
* @param {Person} p - Description of p
*/
Eller i en @returns:
/**
* @returns {Person} Description
*/
For objekter hvis verdier alle er av samme type
/**
* @param {Object.<string, number>} dict
*/
Den første typen (string) dokumenterer typen til nøklene som i JavaScript alltid er en string eller i det minste alltid vil bli tvunget til en string. Den andre typen (number) er typen til verdien; dette kan være hvilken som helst type. Denne syntaksen kan også brukes for @returns.
Ressurser
Nyttig informasjon om dokumentasjon av typer kan finnes her:
https://jsdoc.app/tags-type.html
PS:
for å dokumentere en valgfri verdi kan du bruke []:
/**
* @param {number} [opt_number] this number is optional
*/
eller :
/**
* @param {number|undefined} opt_number this number is optional
*/
Svar #3
Jeg ser at det allerede finnes et svar om @return-taggen, men jeg vil gi flere detaljer om den.
Først og fremst gir ikke den offisielle JSDoc 3-dokumentasjonen oss noen eksempler på @return for et tilpasset objekt. Vennligst se https://jsdoc.app/tags-returns.html. Nå, la oss se hva vi kan gjøre inntil en standard dukker opp.
Funksjonen returnerer et objekt hvor nøklene genereres dynamisk. Eksempel:
{1: 'Pete', 2: 'Mary', 3: 'John'}. Vanligvis itererer vi over dette objektet med hjelp avfor(var key in obj){...}.Mulig JSDoc i henhold til https://google.github.io/styleguide/javascriptguide.xml#JsTypes
/** * @return {Object.<number, string>} */ function getTmpObject() { var result = {} for (var i = 10; i >= 0; i--) { result[i * 3] = 'someValue' + i; } return result }Funksjonen returnerer et objekt hvor nøkler er kjente konstanter. Eksempel:
{id: 1, title: 'Hello world', type: 'LEARN', children: {...}}. Vi kan enkelt få tilgang til egenskaper i dette objektet:object.id.Mulig JSDoc i henhold til https://groups.google.com/forum/#!topic/jsdoc-users/TMvUedK9tC4
Lat som.
/** * Generate a point. * * @returns {Object} point - The point generated by the factory. * @returns {number} point.x - The x coordinate. * @returns {number} point.y - The y coordinate. */ var pointFactory = function (x, y) { return { x:x, y:y } }
Hele Monty.
/** @class generatedPoint @private @type {Object} @property {number} x The x coordinate. @property {number} y The y coordinate. */ function generatedPoint(x, y) { return { x:x, y:y }; } /** * Generate a point. * * @returns {generatedPoint} The point generated by the factory. */ var pointFactory = function (x, y) { return new generatedPoint(x, y); }Definer en type.
/** @typedef generatedPoint @type {Object} @property {number} x The x coordinate. @property {number} y The y coordinate. */ /** * Generate a point. * * @returns {generatedPoint} The point generated by the factory. */ var pointFactory = function (x, y) { return { x:x, y:y } }
I henhold til https://google.github.io/styleguide/javascriptguide.xml#JsTypes
Posttypen.
/** * @return {{myNum: number, myObject}} * An anonymous type with the given type members. */ function getTmpObject() { return { myNum: 2, myObject: 0 || undefined || {} } }
Svar #4
For @return-taggen bruk {{field1: Number, field2: String}}, se: http://wiki.servoy.com/display/public/DOCS/Annotating+JavaScript+using+JSDoc
Svar #5
Hvis en parameter forventes å ha en bestemt egenskap, kan du dokumentere den egenskapen ved å legge til en ekstra @param-tagg. For eksempel, hvis en ansatt-parameter forventes å ha navn og avdelingsegenskaper, kan du dokumentere det som følger:
/**
* Assign the project to a list of employees.
* @param {Object[]} employees - The employees who are responsible for the project.
* @param {string} employees[].name - The name of an employee.
* @param {string} employees[].department - The employee's department.
*/
function(employees) {
// ...
}
Hvis en parameter blir destrukturert uten et eksplisitt navn, kan du gi objektet et passende navn og dokumentere egenskapene det har.
/**
* 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({ name, department }) {
// ...
};
Kilde: JSDoc
