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.


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

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.

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);
};

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.