JSDoc: повертає структуру об'єкта


144

Як я можу розповісти JSDoc про структуру об'єкта, який повертається. Я знайшов @return {{field1: type, field2: type, ...}} descriptionсинтаксис і спробував:

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

Хоча це успішно аналізує, в отриманій документації просто зазначено:

Returns: 
    The location of an event
    Type: Object

Я розробляю API і мені потрібно, щоб люди знали про об'єкт, який їм повернуть. Чи можливо це в JSDoc? Я використовую JSDoc3.3.0-beta1.


Я знаю, що @typedefце рішення / рішення, але дивно це не працює з буквальними об'єктами. Якщо хтось натрапляє на це в майбутньому (як я це зробив), я додав випуск github.com/jsdoc/jsdoc/isissue/1678, який міг би отримати більше інформації, ніж ця сторінка.
Лешек

Відповіді:


263

Визначте свою структуру окремо за допомогою @typdef :

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

І використовувати його як тип повернення:

/**
 * 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
Дякую. Кілька @returnвисловлювань дійсно спрацьовують, але вони відображаються у висновку так, ніби вони були декількома поверненнями (один стан кулі, point - Objectа потім два інші пункти для point.x - Numberі point.y - Number). Хоча я можу з цим жити, я гадаю, що немає можливості мати конденсований вихід поверненого об'єкта? Або принаймні мати записи point.xта point.yвідступити?
BlackWolf

1
Так, це здається найкращим варіантом. Я подумав, що може бути спосіб отримати незвану сутність повернення, але @typedefпідхід є найбільш зрозумілим щодо виходу документації, дякую!
BlackWolf

groovy, видалений перший варіант, оскільки 2-й варіант просто найкращий.
BGerrissen

1
Ви краще додайте @innerабо визначте тип буде мати globalрамки в документації. +1
Onur Yıldırım

1
Я завжди користувався @typedef {Object} Point. Фактично, використовуючи цю дворядкову форму, виділяється Pointу PhpStorm повідомленням "Нерозв’язана змінна чи тип точки". У @typedefдокументах підтримують це, але я не хочу , щоб змінити цю відповідь , якщо це допустимий варіант.
Девід Харкнесс

22

Альтернативою вже опублікованим пропозиціям ви можете скористатися цим форматом:

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

яка дасть наступну документацію:

    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

Чисте рішення - написати клас і повернути це.

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

Коли я це роблю, але використовую компілятор закриття Google, я отримую попередження: "не можна створити екземпляр не-конструктора". Я спробував додати @constructor до функції (над @return), але це не допомогло. Якщо хтось знає, як це виправити, будь ласка, дайте мені знати. Дякую!
AndroidDev

2
@AndroidDev це тому, що функція Pointне є конструктором, щоб змінити те, що замінить тіло Pointфункції наthis.x = x; this.y = y;
Feirell

1
Я не бачу причини, чому нам потрібно використовувати нове тут, чому б просто не повернути точку (x, y)?
CHANist

@CHANist, newсинтаксис - це створити екземпляр із constructor. Без newцього контекст thisбув би глобальним. Ви можете спробувати створити екземпляр, не newбачивши ефекту.
Акаш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.