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/issues/1678ซึ่งอาจมีข้อมูลมากกว่าหน้านี้
Leszek

คำตอบ:


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เอกสารสนับสนุนเรื่องนี้ แต่ฉันไม่ต้องการที่จะแก้ไขคำตอบนี้ถ้ามันเป็นความแตกต่างที่ถูกต้อง
David Harkness

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 Closure Compiler ฉันได้รับคำเตือน: "ไม่สามารถสร้างอินสแตนซ์ของผู้สร้างไม่ใช่" ฉันลองเพิ่ม @constructor ไปยังฟังก์ชัน (เหนือ @return) แต่ก็ไม่ได้ช่วยอะไร หากมีคนรู้วิธีการแก้ไขโปรดแจ้งให้เราทราบ ขอบคุณ!
AndroidDev

2
@AndroidDev นี้เป็นเพราะฟังก์ชั่นPointไม่ได้เป็นตัวสร้างการเปลี่ยนที่แทนที่ร่างกายของPointฟังก์ชั่นด้วยthis.x = x; this.y = y;
Feirell

1
ฉันไม่เห็นสาเหตุที่เราต้องใช้ใหม่ที่นี่ทำไมไม่กลับจุด (x, y)?
CHANist

@CHANist, ไวยากรณ์คือการสร้างอินสแตนซ์จากnew constructorหากปราศจากnewบริบทของการthisเป็นบริบทระดับโลก คุณสามารถลองสร้างอินสแตนซ์โดยไม่newเห็นผลกระทบ
Akash
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.