JSDoc: вернуть структуру объекта

156

Как я могу сообщить 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/issues/1678, в которой может быть больше информации, чем на этой странице.
Leszek

Ответы:

276

Определите свою структуру отдельно, используя @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};
}
BGerrissen
источник
2
Спасибо. Несколько @returnоператоров действительно работают, но они перечислены в выходных данных, как если бы они были несколькими возвратами (один пункт указывает, point - Objectа затем два других пункта для point.x - Numberи point.y - Number). Хотя я могу с этим жить, я полагаю, что нет возможности получить сжатый вывод возвращенного объекта? Или, по крайней мере, иметь записи для point.xи с point.yотступом?
BlackWolf
1
Да, похоже, это лучший вариант. Я думал, что может быть способ получить неименованный объект возврата, но этот @typedefподход является наиболее понятным с точки зрения вывода документации, спасибо!
BlackWolf
groovy, удалил первый вариант, так как 2-й вариант просто лучший.
BGerrissen
2
Вам лучше добавить @innerили ввести определение globalв документации. +1
Онур Йылдырым
1
Я всегда использовал @typedef {Object} Point. Фактически, использование этой двухстрочной формы выделяет Pointв PhpStorm сообщение «Неразрешенная переменная или тип Point». В @typedefдокументах поддерживают это, но я не хочу , чтобы изменить этот ответ , если это допустимый вариант.
Дэвид Харкнесс
24

В качестве альтернативы уже опубликованным предложениям вы можете использовать этот формат:

/**
 * 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.
Мэтт Пенгелли
источник
20

Чистое решение - написать класс и вернуть его.

/** 
 *  @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 Closure Compiler, я получаю предупреждение: «не удается создать экземпляр неконструктора». Я попытался добавить к функции @constructor (над @return), но это не помогло. Если кто-то знает, как это исправить, дайте мне знать. Благодарность!
AndroidDev
2
@AndroidDev, это потому, что функция Pointне является конструктором, чтобы изменить это, замените тело Pointфункции наthis.x = x; this.y = y;
Feirell
1
Я не вижу причины, по которой нам нужно использовать здесь new, почему бы просто не вернуть Point (x, y)?
CHANist
@CHANist, newсинтаксис заключается в создании экземпляра из constructor. Без newконтекста thisбыл бы глобальный контекст. Вы можете попробовать создать экземпляр, newчтобы не увидеть эффекта.
Aakash