JSDoc: Trả về cấu trúc đối tượng


144

Làm thế nào tôi có thể nói với JSDoc về cấu trúc của một đối tượng được trả về. Tôi đã tìm thấy @return {{field1: type, field2: type, ...}} descriptioncú pháp và thử nó:

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

Trong khi phân tích cú pháp này thành công, tài liệu kết quả chỉ nêu rõ:

Returns: 
    The location of an event
    Type: Object

Tôi đang phát triển API và cần mọi người biết về đối tượng mà họ sẽ được trả lại. Điều này có thể có trong JSDoc không? Tôi đang sử dụng JSDoc3.3.0-beta1.


Tôi biết đó @typedeflà một cách giải quyết / giải pháp, nhưng có vẻ lạ khi điều này không hoạt động với các đối tượng theo nghĩa đen. Nếu có ai tình cờ phát hiện ra điều này trong tương lai (như tôi đã làm) tôi đã thêm một vấn đề github.com/jsdoc/jsdoc/issues/1678 có thể có nhiều thông tin hơn trang này.
Leszek

Câu trả lời:


263

Xác định cấu trúc của bạn một cách riêng biệt bằng cách sử dụng @typdef :

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

Và sử dụng nó như kiểu trả về:

/**
 * 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
Cảm ơn. Nhiều @returncâu lệnh thực sự hoạt động, nhưng chúng được liệt kê trong đầu ra như thể chúng là một số trả về (Một trạng thái dấu đầu dòng point - Objectvà sau đó là hai dấu đầu dòng khác cho point.x - Numberpoint.y - Number). Trong khi tôi có thể sống với điều đó, tôi cho rằng không có cách nào có đầu ra cô đọng của đối tượng trả về? Hoặc ít nhất có các mục cho point.xpoint.ythụt lề?
BlackWolf 27/2/2015

1
Vâng, đó có vẻ như là lựa chọn tốt nhất. Tôi nghĩ có thể có một cách để có một thực thể trả lại không được đặt tên, nhưng @typedefcách tiếp cận là cách rõ ràng nhất về đầu ra tài liệu, cảm ơn!
BlackWolf

Groovy, loại bỏ tùy chọn đầu tiên là tùy chọn thứ 2 đơn giản là tốt nhất.
BGerrissen 27/2/2015

1
Bạn tốt hơn nên thêm @innerhoặc định nghĩa loại sẽ có globalphạm vi trong tài liệu. +1
Onur Yıldırım

1
Tôi đã luôn luôn sử dụng @typedef {Object} Point. Trong thực tế, sử dụng các điểm nổi bật của hai dòng này Pointtrong PhpStorm với thông báo "Biến chưa được giải quyết hoặc loại điểm". Các @typedeftài liệu hỗ trợ điều này, nhưng tôi không muốn chỉnh sửa câu trả lời này nếu đó là một biến thể hợp lệ.
David Harkness

22

Một thay thế cho các đề xuất đã được đăng, bạn có thể sử dụng định dạng này:

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

sẽ cung cấp đầu ra tài liệu sau:

    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

Một giải pháp sạch sẽ là viết một lớp và trả lại nó.

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

Khi tôi làm điều này nhưng sử dụng Trình biên dịch đóng cửa của Google, tôi nhận được một cảnh báo: "không thể khởi tạo người không xây dựng". Tôi đã thử thêm @constructor vào hàm (phía trên @return) nhưng không được. Nếu ai đó biết cách khắc phục điều đó, xin vui lòng cho tôi biết. Cảm ơn!
AndroidDev

2
@AndroidDev điều này là do hàm Pointkhông phải là hàm tạo, để thay đổi phần thân của Pointhàm bằngthis.x = x; this.y = y;
Feirell

1
Tôi không thấy lý do tại sao chúng ta cần sử dụng mới ở đây, tại sao không trả về Điểm (x, y)?
CHANist

@CHANist, newcú pháp là tạo một thể hiện từ constructor. Nếu không new, bối cảnh thissẽ là bối cảnh toàn cầu. Bạn có thể thử tạo một thể hiện mà không newthấy hiệu ứng.
Akash
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.