Cách đúng để ghi lại các hàm đối số kết thúc mở trong JSDoc


82

Giả sử bạn có một cái gì đó như sau:

var someFunc = function() {
    // do something here with arguments
}

Làm thế nào bạn sẽ ghi lại một cách chính xác rằng hàm này có thể nhận bất kỳ số đối số nào trong JSDoc? Đây là dự đoán tốt nhất của tôi, nhưng tôi không chắc nó chính xác.

/**
 * @param {Mixed} [...] Unlimited amount of optional parameters
 */
var someFunc = function() {
    // do something here with arguments
}

Liên quan đến: php - Cách doc một số biến tham số

Câu trả lời:


117

Các thông số kỹ thuật JSDocTrình biên dịch đóng cửa của Google thực hiện theo cách này:

@param {...number} var_args

Trong đó "số" là loại đối số được mong đợi.

Sau đó, cách sử dụng hoàn chỉnh của cái này sẽ giống như sau:

/**
* @param {...*} var_args
*/
function lookMaImVariadic(var_args) {
    // Utilize the `arguments` object here, not `var_args`.
}

Lưu ý nhận xét về việc sử dụng arguments(hoặc một số bù đắp của arguments) để truy cập các đối số bổ sung của bạn. var_argsnó chỉ được sử dụng để báo hiệu cho IDE của bạn rằng đối số thực sự tồn tại.

Tham số phần còn lại trong ES6 có thể đưa tham số thực thêm một bước nữa để bao gồm các giá trị đã cung cấp (vì vậy không cần sử dụng thêm arguments):

/**
* @param {...*} var_args
*/
function lookMaImES6Variadic(...var_args) {
    // Utilize the `var_args` array here, not `arguments`.
}

Điều này có lẽ gần với câu trả lời nhất mà chúng ta có thể nhận được :)
kflorence

2
Cũng cần lưu ý, các tệp JSDoc nội bộ của WebStorm (DHTML.js, v.v.) sử dụng cùng một cú pháp này. Có lẽ đó là tiêu chuẩn thực tế.
Scott Rippey

2
nó cũng được mô tả khá tốt ở đây: usejsdoc.org/tags-param.html (phần 'Cho phép một tham số được lặp lại')
Francois

Câu trả lời này nên được chỉnh sửa để tích hợp câu trả lời của Adrian Holovaty: cần phải có một biến thực tế được gọi var_argshoặc bất cứ thứ gì bạn muốn gọi làm tham số duy nhất. Hack buồn.
Oli

1
Với việc bổ sung các thông số nghỉ ngơi trong ES6, điều này có ý nghĩa hơn rất nhiều. /** @param {...Function} tasks The tasks. */ function waterfallTasks(...tasks) {Tham số phần còn lại luôn có một chức năng hiện diện trong các tham số.
Shibumi

25

Cách thực hiện việc này hiện được mô tả trong tài liệu JSDoc và nó sử dụng dấu chấm lửng giống như tài liệu Closure.

@param {...<type>} <argName> <Argument description>

Bạn cần cung cấp một kiểu để đi sau dấu chấm lửng, nhưng bạn có thể sử dụng a *để mô tả việc chấp nhận bất kỳ thứ gì hoặc sử dụng |để tách nhiều kiểu có thể chấp nhận được. Trong tài liệu đã tạo, JSDoc sẽ mô tả đối số này là có thể lặp lại , giống như cách nó mô tả đối số tùy chọntùy chọn .

Trong thử nghiệm của tôi, không cần phải có đối số trong định nghĩa hàm javascript thực tế, vì vậy mã thực tế của bạn có thể chỉ có dấu ngoặc đơn trống, tức là function whatever() { ... }.

Loại đơn:

@param {...number} terms Terms to multiply together

Bất kỳ loại nào (trong ví dụ bên dưới, dấu ngoặc vuông có nghĩa là itemssẽ được gắn thẻ là tùy chọn và có thể lặp lại):

@param {...*} [items] - zero or more items to log.

Nhiều loại cần có dấu ngoặc đơn quanh danh sách loại, với dấu chấm lửng trước dấu ngoặc mở đầu:

@param {...(Person|string)} attendees - Meeting attendees, listed as either 
                                        String names or {@link Person} objects

1
Và đối tượng được sử dụng như các cặp khóa-giá trị thì sao ?. Hiện tại tôi đang sử dụng: @param {{...(key: value)}} [config] - specific configs for this transfernhưng đã tự hỏi nếu điều này là chính xác?
Tối đa

@Max Tôi không thể biết từ tài liệu nếu đó là cách chính thức đúng để làm điều đó, nhưng có vẻ như nó sẽ hoạt động như mong đợi. Vì vậy, nếu nó tạo ra đầu ra mà bạn không sao cả, tôi sẽ sử dụng nó :)
Daniel Baird

10

Từ nhóm người dùng JSDoc :

Không có bất kỳ cách chính thức nào, nhưng một giải pháp khả thi là:

/**
 * @param [...] Zero or more child nodes. If zero then ... otherwise ....
 */

Dấu ngoặc vuông cho biết một tham số tùy chọn và ... sẽ (đối với tôi) chỉ ra "một số tùy ý."

Một khả năng khác là ...

/**
 * @param [arguments] The child nodes.
 */

Dù bằng cách nào cũng nên truyền đạt ý của bạn.

Mặc dù nó hơi cũ (2007), nhưng tôi không biết về bất cứ điều gì mới hơn.

Nếu bạn cần ghi lại kiểu tham số là 'hỗn hợp', hãy sử dụng {*}, như trong @param {*} [arguments].


6
Tôi không phiền khi câu trả lời của mình bị từ chối, nhưng tôi mong đợi một nhận xét giải thích lý do tại sao bạn làm vậy (dù bạn là ai). Nếu bạn nghĩ điều đó là sai, hãy để tôi - và tất cả chúng ta - biết tại sao.
hashchange vào

2
IDE mà tôi lựa chọn (WebStorm 8.0.1) hỗ trợ cú pháp số 2 @param [arguments](hoặc @param {*} [arguments]cho vấn đề đó) cũng như cú pháp được thiết lập bởi trình biên dịch Google Closure (được đề cập trong một câu trả lời khác). @param [...]không được hỗ trợ.
mistaecko

@mistaecko nhưng chỉ với các tham số được đặt tên có đúng không? Đó là những gì tôi không sử dụng, vì vậy đây không phải là một câu trả lời có thể chấp nhận đối với tôi ...
Sebastian

10

Tôi đã tương lai với điều này trong một thời gian khá dài. Dưới đây là cách thực hiện với Trình biên dịch đóng cửa của Google:

/**
* @param {...*} var_args
*/
function my_function(var_args) {
    // code that accesses the magic 'arguments' variable...
}

Điều quan trọng là cung cấp cho hàm của bạn một var_argstham số (hoặc bất cứ thứ gì bạn gọi nó trong @paramcâu lệnh của mình ) ngay cả khi hàm không thực sự sử dụng tham số đó.

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.