JSDoc: Zwróć strukturę obiektu

144

Jak mogę poinformować JSDoc o strukturze zwracanego obiektu. Znalazłem @return {{field1: type, field2: type, ...}} descriptionskładnię i wypróbowałem ją:

/**
 * 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};
}

Chociaż ta analiza przebiega pomyślnie, wynikowa dokumentacja po prostu stwierdza:

Returns: 
    The location of an event
    Type: Object

Rozwijam API i potrzebuję, aby ludzie wiedzieli o obiekcie, który otrzymają. Czy to możliwe w JSDoc? Używam JSDoc3.3.0-beta1.

Czarny wilk
źródło
Wiem, że @typedefjest to obejście / rozwiązanie, ale wydaje się dziwne, że nie działa to z obiektami dosłownymi. Jeśli ktoś się na to natknie w przyszłości (tak jak ja), dodałem problem github.com/jsdoc/jsdoc/issues/1678, który może zawierać więcej informacji niż ta strona.
Leszek

Odpowiedzi:

263

Zdefiniuj swoją strukturę oddzielnie, używając @typdef :

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

I użyj go jako typu zwracanego:

/**
 * 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};
}
BGerrissen
źródło
2
Dzięki. Wiele @returninstrukcji rzeczywiście działa, ale są one wyświetlane w danych wyjściowych tak, jakby były kilkoma zwrotami (jeden stan wypunktowania, point - Objecta następnie dwa inne wypunktowanie dla point.x - Numberi point.y - Number). Chociaż mogę z tym żyć, przypuszczam, że nie ma sposobu na uzyskanie skondensowanego wyniku zwróconego obiektu? Czy przynajmniej mają wpisy dla point.xi point.ywcięcia?
BlackWolf
1
Tak, to wydaje się najlepszą opcją. Pomyślałem, że może istnieć sposób na uzyskanie nienazwanej jednostki zwrotu, ale @typedefpodejście jest najbardziej jasne pod względem wyników dokumentacji, dzięki!
BlackWolf
groovy, usunąłem pierwszą opcję, ponieważ druga opcja jest po prostu najlepsza.
BGerrissen
1
Lepiej dodaj @innerlub definicja typu będzie miała globalzakres w dokumentacji. +1
Onur Yıldırım
1
Zawsze używałem @typedef {Object} Point. W rzeczywistości, użycie tego dwuwierszowego formularza podświetla Pointw PhpStorm komunikat „Nierozwiązana zmienna lub wpisz Punkt”. W @typedefdocs wspierać to, ale nie chcę, aby edytować tę odpowiedź, czy jest to prawidłowy wariant.
David Harkness,
22

Alternatywnie do już opublikowanych sugestii możesz użyć tego formatu:

/**
 * 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
  }
}

co da następującą dokumentację wyjściową:

    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.
Matt Pengelly
źródło
17

Czystym rozwiązaniem jest napisanie klasy i zwrócenie jej.

/** 
 *  @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);
};
łosie
źródło
Kiedy robię to, ale używam Google Closure Compiler, pojawia się ostrzeżenie: „nie można utworzyć instancji innej niż konstruktor”. Próbowałem dodać @constructor do funkcji (nad @return), ale to nie pomogło. Jeśli ktoś wie, jak to naprawić, daj mi znać. Dzięki!
AndroidDev
2
@AndroidDev dzieje się tak dlatego, że funkcja Pointnie jest konstruktorem, aby zmienić tę funkcję , aby zastąpić Pointthis.x = x; this.y = y;
treść
1
Nie widzę powodu, dla którego musimy tutaj użyć new, dlaczego po prostu nie zwrócić Point (x, y)?
CHANist,
@CHANist, newskładnia polega na utworzeniu instancji z pliku constructor. Bez newkontekstu thisbyłby kontekst globalny. Możesz spróbować utworzyć instancję bez newzobaczenia efektu.
Akash