JSDoc'ta açık uçlu bağımsız değişken işlevlerini belgelemenin doğru yolu


84

Aşağıdakine benzer bir şeye sahip olduğunuzu varsayalım:

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

Bu işlevin JSDoc'ta herhangi bir sayıda argüman alabileceğini nasıl doğru bir şekilde belgelersiniz? Bu benim en iyi tahminim ama doğru olduğundan emin değilim.

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

İlgili: php - Değişken sayıda parametre nasıl belgelendirilir

Yanıtlar:


119

JSDoc gözlük ve Google'ın Kapatma Derleyici bu şekilde yapın:

@param {...number} var_args

Burada "sayı", beklenen bağımsız değişkenlerin türüdür.

Bunun tam kullanımı şu şekilde görünecektir:

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

Ek argümanlarınıza erişmek için kullanma arguments(veya ofsetinin bir kısmı arguments) hakkındaki yorumu not edin . var_argssadece IDE'nize argümanın gerçekten var olduğunu bildirmek için kullanılır.

ES6'daki dinlenme parametreleri , sağlanan değerleri kapsayacak şekilde gerçek parametreyi bir adım öteye taşıyabilir (bu nedenle, artık kullanılmasına argumentsgerek yoktur):

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

Bu muhtemelen alabileceğimiz bir yanıta yakın :)
— kflorence

2
Ayrıca, WebStorm'un dahili JSDoc dosyaları (DHTML.js, vb.) Aynı sözdizimini kullanır. Belki de fiili standarttır.
— Scott Rippey

2
burada da oldukça iyi açıklanmıştır: usejsdoc.org/tags-param.html ('Bir parametrenin tekrarlanmasına izin verir' bölümü)
— Francois

Bu cevap Adrian Holovaty cevabını bütünleştirmek için düzenlenmiş olması gerekir: Orada ihtiyacı gerçek bir değişken çağrılacak var_argsya da tek parametre olarak içinde aramak istediğini. Üzgün ​​hile.
— Oli

1
ES6'da dinlenme parametrelerinin eklenmesi ile bu çok daha mantıklı hale geliyor. /** @param {...Function} tasks The tasks. */ function waterfallTasks(...tasks) {Dinlenme parametreleri her zaman parametrelerde işlevsel bir varlığa sahiptir.
— Shibumi

27

Bunun nasıl yapılacağı artık JSDoc belgelerinde açıklanmaktadır ve Kapanış belgelerinin yaptığı gibi bir üç nokta kullanır.

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

Üç noktadan sonra gitmek için bir tür sağlamanız gerekir, ancak *herhangi bir şeyi kabul etmeyi açıklamak için a kullanabilir veya |kabul edilebilir birden çok türü ayırmak için kullanabilirsiniz . Oluşturulan belgelerde JSDoc bu bağımsız değişkeni, isteğe bağlı bağımsız değişkenleri isteğe bağlı olarak tanımladığı gibi tekrarlanabilir olarak tanımlayacaktır .

Testlerimde, gerçek javascript fonksiyon tanımında bir argümana sahip olmaya gerek yoktu, bu nedenle gerçek kodunuzda boş parantezler olabilir, yani function whatever() { ... }.

Tek tip:

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

Herhangi bir tür (aşağıdaki örnekte, köşeli parantezlerin itemshem isteğe bağlı hem de tekrarlanabilir olarak etiketleneceği anlamına gelir ):

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

Birden çok tür, tür listesi etrafında, üç nokta açılış parantezinden önce olacak şekilde parantez gerektirir:

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

1
Peki ya anahtar-değer çiftleri olarak kullanılan nesne? Şu anda kullanıyorum: @param {{...(key: value)}} [config] - specific configs for this transferama bunun doğru olup olmadığını merak ediyor muydunuz?
— Maksimum

@Max Bunu yapmanın resmi doğru yolu olup olmadığını belgelerden anlayamıyorum, ancak beklendiği gibi çalışması gerekiyor gibi görünüyor. Yani, sizin için uygun bir çıktı
— Daniel Baird

10

Gönderen JSDoc kullanıcıları grubuna :

Resmi bir yol yok, ancak olası bir çözüm şudur:

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

Köşeli parantezler isteğe bağlı bir parametreyi belirtir ve ... işareti (bana göre) "bazı rastgele sayıları" gösterir.

Bir başka olasılık da bu ...

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

Her iki şekilde de ne demek istediğinizi iletmelisiniz.

Yine de biraz eski (2007), ancak daha güncel bir şeyin farkında değilim.

Eğer 'karışık', kullanımı gibi param türü belgelemek gerekiyorsa {*}olduğu gibi @param {*} [arguments].


6
Cevabımın olumsuz oylanması umurumda değil, ancak neden yaptığınızı (her kimseniz) açıklayan bir yorum bekliyorum. Yanlış olduğunu düşünüyorsanız, bana - ve hepimize - nedenini bildirin.
— hashchange

2
Tercih ettiğim IDE (WebStorm 8.0.1), sözdizimi # 2'yi @param [arguments](veya @param {*} [arguments]bu konuda) ve ayrıca Google Closure derleyicisi tarafından oluşturulan sözdizimini (başka bir yanıtta belirtilmiştir) destekler. @param [...]desteklenmiyor.
— mistaecko

@mistaecko, ancak yalnızca adlandırılmış parametrelerle doğru mu? Kullanmadığım şey bu, bu yüzden bu benim için kabul edilebilir bir cevap değil ...
— Sebastian

10

Bir süre bununla uğraştım. Google Closure Compiler ile bunu şu şekilde yapabilirsiniz:

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

Önemli olan , işlev aslında o parametreyi kullanmasa bile , işlevinize bir var_argsparametre (veya @paramdeyiminizde onu ne adlandırırsanız) vermektir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.