JSDoc: restituisce la struttura dell'oggetto


144

Come posso comunicare a JSDoc la struttura di un oggetto che viene restituito. Ho trovato la @return {{field1: type, field2: type, ...}} descriptionsintassi e l'ho provata:

/**
 * Returns a coordinate from a given mouse or touch event
 * @param  {TouchEvent|MouseEvent|jQuery.Event} e    
 *         A valid mouse or touch event or a jQuery event wrapping such an
 *         event. 
 * @param  {string} [type="page"]
 *         A string representing the type of location that should be
 *         returned. Can be either "page", "client" or "screen".
 * @return {{x: Number, y: Number}} 
 *         The location of the event
 */
var getEventLocation = function(e, type) {
    ...

    return {x: xLocation, y: yLocation};
}

Mentre questo analizza correttamente, la documentazione risultante afferma semplicemente:

Returns: 
    The location of an event
    Type: Object

Sto sviluppando un'API e ho bisogno che le persone sappiano dell'oggetto che verranno restituite. È possibile in JSDoc? Sto usando JSDoc3.3.0-beta1.


So che @typedefè una soluzione alternativa / soluzione, ma sembra strano che non funzioni con oggetti letterali. Se qualcuno si imbatte in questo in futuro (come ho fatto io) ho aggiunto un problema github.com/jsdoc/jsdoc/issues/1678 che potrebbe avere più informazioni di questa pagina.
Leszek,

Risposte:


263

Definisci la tua struttura separatamente usando un @typdef :

/**
 * @typedef {Object} Point
 * @property {number} x - The X Coordinate
 * @property {number} y - The Y Coordinate
 */

E usalo come tipo di ritorno:

/**
 * Returns a coordinate from a given mouse or touch event
 * @param  {TouchEvent|MouseEvent|jQuery.Event} e    
 *         A valid mouse or touch event or a jQuery event wrapping such an
 *         event. 
 * @param  {string} [type="page"]
 *         A string representing the type of location that should be
 *         returned. Can be either "page", "client" or "screen".
 * @return {Point} 
 *         The location of the event
 */
var getEventLocation = function(e, type) {
    ...

    return {x: xLocation, y: yLocation};
}

2
Grazie. Le @returnistruzioni multiple funzionano davvero, ma sono elencate nell'output come se fossero diversi ritorni (un punto elenco indica point - Objecte poi altri due punti elenco per point.x - Numbere point.y - Number). Mentre posso convivere con quello, suppongo che non ci sia modo di avere un output condensato dell'oggetto restituito? O almeno le voci per point.xe point.yrientrate?
BlackWolf,

1
Sì, sembra l'opzione migliore. Ho pensato che ci potesse essere un modo per avere un'entità di ritorno senza nome, ma l' @typedefapproccio è il più chiaro in termini di output della documentazione, grazie!
BlackWolf,

groovy, rimossa la prima opzione come seconda opzione è semplicemente la migliore.
BGerrissen,

1
È meglio aggiungere @innero digitare la definizione avrà globalportata nella documentazione. +1
Onur Yıldırım,

1
L'ho sempre usato @typedef {Object} Point. In effetti, l'utilizzo di questo modulo a due righe evidenzia Pointin PhpStorm il messaggio "Variabile non risolta o tipo Point". I @typedefdocumenti lo supportano, ma non voglio modificare questa risposta se è una variante valida.
David Harkness,

22

In alternativa ai suggerimenti già pubblicati, puoi utilizzare questo formato:

/**
 * Get the connection state.
 *
 * @returns {Object} connection The connection state.
 * @returns {boolean} connection.isConnected Whether the authenticated user is currently connected.
 * @returns {boolean} connection.isPending Whether the authenticated user's connection is currently pending.
 * @returns {Object} connection.error The error object if an error occurred.
 * @returns {string} connection.error.message The error message.
 * @returns {string} connection.error.stack The stack trace of the error.
 */
getConnection () {
  return {
    isConnected: true,
    isPending: false,
    error
  }
}

che fornirà il seguente output di documentazione:

    Get the connection state.

    getConnection(): Object

    Returns
    Object: connection The connection state.
    boolean: connection.isConnected Whether the authenticated user is currently connected.
    boolean: connection.isPending Whether the authenticated users connection is currently pending.
    Object: connection.error The error object if an error occurred.
    string: connection.error.message The error message.
    string: connection.error.stack The stack trace of the error.

17

Una soluzione pulita è scrivere una classe e restituirla.

/** 
 *  @class Point
 *  @type {Object}
 *  @property {number} x The X-coordinate.
 *  @property {number} y The Y-coordinate.
 */
function Point(x, y) {
  return {
        x: x,
        y: y
    };
}

/**
 * @returns {Point} The location of the event.
 */
var getEventLocation = function(e, type) {
    ...
    return new Point(x, y);
};

Quando lo faccio ma utilizzo Google Closure Compiler, ricevo un avviso: "impossibile creare un'istanza di non-costruttore". Ho provato ad aggiungere @constructor alla funzione (sopra @return) ma non ha aiutato. Se qualcuno sa come risolverlo, per favore fatemelo sapere. Grazie!
AndroidDev

2
@AndroidDev questo è perché la funzione Pointnon è un costruttore, per cambiare che sostituisce il corpo della Pointfunzione conthis.x = x; this.y = y;
Feirell

1
Non vedo il motivo per cui dobbiamo usare new qui, perché non semplicemente restituire Point (x, y)?
CHANISTA

@CHANist, la newsintassi è creare un'istanza dal constructor. Senza new, il contesto di thissarebbe il contesto globale. Puoi provare a creare un'istanza senza newvedere l'effetto.
Akash,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.