Sınırlı olası değerlerle jsdoc'ta bir dize türü nasıl belgelenir


96

Bir dize parametresini kabul eden bir işleve sahibim. Bu parametre, tanımlanmış birkaç olası değerden yalnızca birine sahip olabilir. Aynı şeyi belgelemenin en iyi yolu nedir? ShapeType, enum veya TypeDef veya başka bir şey olarak tanımlanmalı mı?

Shape.prototype.create = function (shapeType) {
    // shapeType can be "rect", "circle" or "ellipse"...
    this.type = shapeType;
};

Shape.prototype.getType = function (shapeType) {
    // shapeType can be "rect", "circle" or "ellipse"...
    return this.type;
};

Sorunun ikinci kısmı, önerdiğiniz her şeyi shapeTypetanımlayan dosyada olası değerlerinin bilinmemesidir shapeType. Çeşitli geliştiricilerin katkıda bulunduğu ve olası değerlerini ekleyebilecek birden çok dosya var shapeType.

Not: Kullanıyorum jsdoc3


Çoklu dosya sorunu bunu zorlaştırır. Genellikle bir bakın enumtanımı ve işlevi parametresi için bir birlik için: ShapeType|string. Ancak numaralandırmalar Closure-compiler'da bildirimden sonra alt türlerin eklenmesini desteklemez.
Chad Killingsworth

@ChadKillingsworth Ne demek istediğini anlıyorum. Bir özellik kümesi tanımlamak istediğim bir noktada sıkıştım (bir sınıfın yapım parametresi olarak giden bir nesne diyelim). Yapının tüm özellikleri tek bir yerde tanımlanmış olması iyi ve iyidir. Ne yazık ki, kodumun bu yapı özelliklerine katkıda bulunan bir dizi modülü var. Mixin gibi bir şey yapmak veya mülk sahibini alt sınıflara ayırmak denize düşmek olacaktır! Bu nedenle, bir özellik listesi tanımına basitçe enjekte edebilirsem harika olur.
Shamasis Bhattacharya

Ben bakan ama dağıtılmış mülkiyet girişle ilgili olduğumu başka benzer bir konudur stackoverflow.com/questions/19113571/...
Shamasis Bhattacharya

Aşağıdaki tüm çözümler bizi bir Enum oluşturmaya zorluyor. GitHub'da bu işlemi daha kolay hale getirmek için aktif bir özellik isteği var: github.com/jsdoc3/jsdoc/issues/629 . Yani bundan hoşlanan herhangi biri muhtemelen çarpmalı.
B12Toaster

Yanıtlar:


26

Sahte bir enum beyan etmeye ne dersiniz:

/**
 * Enum string values.
 * @enum {string}
 */
Enumeration = {
    ONE: "The number one",
    TWO: "A second number"
};

/**
 * Sample.
 * @param {Enumeration} a one of the enumeration values.
 */
Bar.prototype.sample = function(a) {};


b = new Bar();

bar.sample(Enumeration.ONE)

Ancak bunun için enum'u JSDOC'a bildirmeniz gerekir. Ancak kod temizdir ve WebStorm'da otomatik tamamlama elde edersiniz.

Birden çok dosya sorunu bu şekilde çözülemez.


Evet. Numaralandırma yaklaşımı, gördüğüm tek kullanışlı yol. Her neyse, bunu tek kullanılabilir cevap olarak kabul ediyorum - çünkü çoklu dosya sorunu tamamen başka bir hikaye!
Shamasis Bhattacharya

Bu yaklaşımla ilgili sorun, bireysel değerlerin belgelenmesine izin vermemesidir. JSDoc ile ilgili bir sorunum var. github.com/jsdoc3/jsdoc/issues/1065
Gajus

112

İtibariyle 2014'ün sen yazma olanağına sahip jsdoc3 içinde:

/**
 * @param {('rect'|'circle'|'ellipse')} shapeType - The allowed type of the shape
 */
Shape.prototype.getType = function (shapeType) {
  return this.type;
};

Elbette bu, adanmış bir enum kadar yeniden kullanılabilir olmayacaktır, ancak çoğu durumda, yalnızca bir işlev tarafından kullanılıyorsa, kukla bir enum, aşırı bir değerdir.

Ayrıca bkz .: https://github.com/jsdoc3/jsdoc/issues/629#issue-31314808


4
Param türünün asla değişmeyeceğini biliyorsanız, bu daha iyi bir çözümdür.
Luca Steeb

1
Bence buna en iyi çözüm! Teşekkür ederim.
AJC24

26

Ne dersin:

/**
 * @typedef {"keyvalue" | "bar" | "timeseries" | "pie" | "table"} MetricFormat
 */

/**
 * @param format {MetricFormat}
 */
export function fetchMetric(format) {
    return fetch(`/matric}`, format);
}

görüntü açıklamasını buraya girin


9

JSDoc'da izin verilen değerleri yazmanın resmi bir yolu olduğunu sanmıyorum .

Kesinlikle b12toaster@param {String('up'|'down'|'left'|'right')} kullanıcısının bahsettiği gibi bir şey yazabilirsiniz .

görüntü açıklamasını buraya girin

Ancak, APIDocjs'den referans alarak , burada kısıtlı değerler yazmak için kullandığım şey, yani allowValues .

/**
 * Set the arrow position of the tooltip
 * @param {String='up','down','left','right'} position pointer position
 */
setPosition(position='left'){
  // YOUR OWN CODE
}

Oh evet, ES6 kullanıyorum.


0

Closure Compiler bunu şu şekilde destekler: kısıtlı bir türü tanımlamak için "@enum" kullanabilirsiniz. Aslında enum tanımındaki değerleri tanımlamanız gerekmez. Örneğin, şöyle bir "tamsayı" türü tanımlayabilirim:

/** @enum {number} */
var Int = {};

/** @return {Int} */
function toInt(val) {
  return /** @type {Int} */ (val|0);
}

Int genellikle "sayı" ya atanabilir (bu bir sayıdır), ancak "sayı", bazı zorlama (bir atama) olmaksızın "Int" ye atanamaz.


Ancak bu, olası değerlerini kısıtlamaz Int. Mümkün olduğundan emin olmadığım kısım bu.
Chad Killingsworth

JS'deki diğer tür ek açıklamaları veya numaralandırmaları kadar yapar. Kısıtlama, kodu nasıl yazdığınızdan gelir: her "cast" bir kırmızı bayraktır. Yayınları değer fabrikaları ile sınırlarsanız, istediğinizi elde edersiniz: 'Sayı' yı uyarı yapmadan 'Int' olarak atayamazsınız.
John

Yine de {Int} değerlerini kısıtlamaz. :-(
Shamasis Bhattacharya

Elbette öyle, nasıl oluşturulduğunu sınırlayarak Int değerini kısıtlıyorsunuz ve değer yaratıldığında kısıtlama yapılır. Tek ihtiyacınız olan ham numara atanamaz.
John
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.