Tham số hàm bị hủy tài liệu trong JSDoc


90

Trước đây, tôi luôn ghi lại các thông số đối tượng của mình như sau:

/**
 * Description of the function
 *
 * @param {Object} config - The configuration
 * @param {String} config.foo
 * @param {Boolean} [config.bar] - Optional value
 * @return {String}
 */
function doSomething (config = {}) {
  const { foo, bar } = config;
  console.log(foo, bar);
  // do something
}

Nhưng tôi không chắc cách tiếp cận tốt nhất với tham số hàm được mô tả là gì. Tôi chỉ bỏ qua đối tượng, xác định nó bằng cách nào đó hay cách tốt nhất để ghi lại nó là gì?

/**
 * Description of the function
 *
 * @param {String} foo
 * @param {Boolean} [bar] - Optional value
 * @return {String}
 */
function doSomething ({ foo, bar } = {}) {
  console.log(foo, bar);
  // do something
}

Tôi cảm thấy như cách tiếp cận của tôi ở trên không làm cho nó rõ ràng rằng hàm mong đợi một objecttham số chứ không phải hai tham số khác nhau.

Một cách khác mà tôi có thể nghĩ ra sẽ sử dụng @typedef, nhưng điều đó có thể trở thành một mớ hỗn độn lớn (đặc biệt là trong một tệp lớn hơn với nhiều phương thức)?

/**
 * @typedef {Object} doSomethingConfiguration
 * @property {String} foo
 * @property {Boolean} [bar] - Optional value
 */

/**
 * Description of the function
 *
 * @param {doSomethingConfiguration}
 * @return {String}
 */
function doSomething ({ foo, bar } = {}) {
  console.log(foo, bar);
  // do something
}

1
Tôi nghĩ cách tiếp cận đầu tiên vẫn ổn. Không ai quan tâm liệu đối tượng có được đặt tên configtrong mã của bạn hay không có tên nào cả.
Bergi

Trong WebStorm, tôi thấy rằng nếu tôi chỉ mô tả các tham số (sau khi hủy cấu trúc) và bỏ qua cấu trúc hủy thì nó hầu như hoạt động trừ những trường hợp ít phổ biến hơn. Vì vậy, trong ví dụ của bạn, hãy mô tả hai tham số foobar. Đó không phải là giải pháp cuối cùng, nhưng bất kỳ cách tiếp cận nào sử dụng một đối tượng đều dẫn đến lỗi kiểm tra - và kiểm tra và tự động hoàn thành từ IDE là điều tôi quan tâm nhất.
Mörre

Câu trả lời:


96

Đây là cách nó dự định, như được mô tả trong tài liệu .

/**
 * My cool function.
 *
 * @param {Object} obj - An object.
 * @param {string} obj.prop1 - Property 1.
 * @param {string} obj.prop2 - Property 2.
 */
var fn = function ({prop1, prop2}) {
  // Do something with prop1 and prop2
}

Vì vậy, ví dụ đầu tiên của bạn là khá nhiều chính xác.

Một ví dụ khác với một số lồng ghép sâu hơn:

/**
 * Nesting example.
 *
 * @param {object} param
 * @param {number} param.a - First value
 * @param {object} param.b - Wrapper
 * @param {number} param.b.c - Second value
 * @return {number} sum a and b
 */
letters = ({a, b: {c}}) => a + c;

Tôi không thấy JSDoc hoạt động rõ ràng như thế nào khi bạn có nhiều đối số bị hủy, như function ({a}, {a}) {}. JSDoc mà tôi đoán sẽ là @param {object} param1, @param {*} param1.a, @param {object} param2, @param {*} param2.a, và dựa vào thứ tự của các @paramthẻ?
ZachB

@ZachB: function ({a}, {a}) {}là cú pháp không hợp lệ, vì ađược định nghĩa hai lần, ở đó.
Cerbrus

1
Giáo sư. ({a: b}, {a}))hoặc ({a}, {b})- điểm là @paramcác thẻ JSDoc là AFAIK không có thứ tự và các khóa có thể không rõ ràng là JSDoc để cố gắng khớp bằng cách sử dụng tên thuộc tính. Phiên bản tiếp theo của VSCode sẽ sử dụng tra cứu vị trí để giải quyết tình huống này.
ZachB

1
Cảm ơn, @ d0gb3r7. Tôi đã cập nhật liên kết trong câu trả lời.
Cerbrus


-8

Xem "Tài liệu hóa thuộc tính của tham số" của JSDoc :

/**
 * Assign the project to an employee.
 * @param {Object} employee - The employee who is responsible for the project.
 * @param {string} employee.name - The name of the employee.
 * @param {string} employee.department - The employee's department.
 */
Project.prototype.assign = function(employee) {
    // ...
};

( Kiểm tra loại trình biên dịch Google Closure , dựa trên nhưng được chuyển hướng từ JSDoc, cũng cho phép @param {{x:number,y:number}} point A "point-shaped" object.)


2
Không phải anh ấy đã làm điều đó rồi sao? Anh ta đang hỏi phải làm gì bây giờ khi không còn employeebiến trong hàm nữa.
Bergi

7
Điều này không trả lời câu hỏi - ví dụ này không sử dụng hàm hủy! Với cấu trúc hủy bạn không có đối tượng cha.
Mörre

Trên thực tế, cùng một liên kết của anh ấy, ngay sau ví dụ của anh ấy đưa ra một ví dụ tương đối với cùng các nhận xét jsdoc chính xác cho Project.prototype.assign = function({ name, department }). Trước ví dụ, họ nói, "Nếu một tham số bị hủy mà không có tên rõ ràng, bạn có thể đặt cho đối tượng một giá trị thích hợp và ghi lại các thuộc tính của nó."
notacouch
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.