JSDoc: Mengembalikan struktur objek

156

Bagaimana saya bisa memberi tahu JSDoc tentang struktur suatu objek yang dikembalikan. Saya telah menemukan @return {{field1: type, field2: type, ...}} descriptionsintaks dan mencobanya:

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

Meskipun penguraian ini berhasil, dokumentasi yang dihasilkan hanya menyatakan:

Returns: 
    The location of an event
    Type: Object

Saya sedang mengembangkan API dan membutuhkan orang untuk mengetahui tentang objek yang akan mereka dapatkan kembali. Apakah ini mungkin di JSDoc? Saya menggunakan JSDoc3.3.0-beta1.

Serigala hitam
sumber
Saya tahu itu @typedefadalah solusi / solusi, tetapi tampaknya aneh jika ini tidak berfungsi dengan objek literal. Jika ada yang menemukan ini di masa mendatang (seperti yang saya lakukan), saya telah menambahkan masalah github.com/jsdoc/jsdoc/issues/1678 yang mungkin memiliki info lebih banyak daripada halaman ini.
Leszek

Jawaban:

276

Tentukan struktur Anda secara terpisah menggunakan @typdef :

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

Dan gunakan itu sebagai tipe pengembalian:

/**
 * 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
sumber
2
Terima kasih. Beberapa @returnpernyataan memang berfungsi, tetapi mereka terdaftar dalam output seolah-olah itu adalah beberapa pengembalian (Satu status poin point - Objectdan kemudian dua poin peluru lainnya untuk point.x - Numberdan point.y - Number). Sementara saya bisa hidup dengan itu, saya kira tidak ada cara untuk memiliki output kental dari objek yang dikembalikan? Atau setidaknya memiliki entri point.xdan point.yindentasi?
BlackWolf
1
Ya, sepertinya itu pilihan terbaik. Saya pikir mungkin ada cara untuk memiliki entitas pengembalian tanpa nama, tetapi @typedefpendekatannya adalah yang paling jelas dalam hal keluaran dokumentasi, terima kasih!
BlackWolf
groovy, menghapus opsi pertama karena opsi ke-2 adalah yang terbaik.
BGerrissen
2
Anda lebih baik menambahkan @inneratau jenis definisi akan memiliki globalruang lingkup dalam dokumentasi. +1
Onur Yıldırım
1
Saya selalu menggunakan @typedef {Object} Point. Faktanya, menggunakan formulir dua baris ini menyoroti Pointdi PhpStorm dengan pesan "Variabel tidak terselesaikan atau jenis Titik". The @typedefdocs mendukung ini, tapi saya tidak ingin mengedit jawaban ini jika varian valid.
David Harkness
24

Alternatif untuk saran yang sudah diposting, Anda dapat menggunakan format ini:

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

yang akan memberikan keluaran dokumentasi berikut:

    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
sumber
20

Solusi bersih adalah menulis kelas dan mengembalikannya.

/** 
 *  @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);
};
rusa besar
sumber
Ketika saya melakukan ini tetapi menggunakan Google Closure Compiler, saya mendapat peringatan: "tidak dapat membuat contoh non-konstruktor". Saya mencoba menambahkan @constructor ke fungsi (di atas @return) tetapi tidak membantu. Jika seseorang tahu cara memperbaikinya, beri tahu saya. Terima kasih!
AndroidDev
2
@AndroidDev ini karena fungsinya Pointbukan konstruktor, untuk mengubahnya menggantikan tubuh Pointfungsi denganthis.x = x; this.y = y;
Feirell
1
Saya tidak melihat alasan mengapa kita perlu menggunakan new di sini, mengapa tidak mengembalikan Point (x, y) saja?
CHANist
@CHANist, newsintaksnya adalah membuat sebuah instance dari constructor. Tanpa new, konteks thisakan menjadi konteks global. Anda dapat mencoba membuat sebuah instance tanpa newmelihat efeknya.
Aakash