วิธีจัดทำเอกสารประเภทสตริงใน jsdoc ด้วยค่าที่เป็นไปได้ที่ จำกัด


96

ฉันมีฟังก์ชันที่ยอมรับพารามิเตอร์สตริงหนึ่งตัว พารามิเตอร์นี้สามารถมีค่าที่เป็นไปได้ที่กำหนดไว้เพียงไม่กี่ค่าเท่านั้น วิธีที่ดีที่สุดในการจัดทำเอกสารแบบเดียวกันคืออะไร? ควรกำหนด shapeType เป็น enum หรือ TypeDef หรืออย่างอื่น?

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

ส่วนที่สองของปัญหาคือค่าที่เป็นไปได้ของshapeTypeไม่เป็นที่รู้จักในไฟล์ที่กำหนดshapeTypeเป็นสิ่งที่คุณแนะนำ มีไฟล์หลายไฟล์ที่มาจากนักพัฒนาหลายคนซึ่งอาจเพิ่มค่าที่เป็นไปได้ของshapeTypeไฟล์.

PS: กำลังใช้ jsdoc3


ปัญหาหลายไฟล์ทำให้เรื่องนี้ยาก ฉันมักจะเห็นสำหรับความหมายและสหภาพสำหรับพารามิเตอร์ฟังก์ชั่นนี้:enum ShapeType|stringอย่างไรก็ตาม enums ไม่รองรับการเพิ่มประเภทย่อยหลังจากการประกาศใน Closure-compiler
Chad Killingsworth

@ChadKillingsworth ฉันเข้าใจว่าคุณหมายถึงอะไร ฉันติดอยู่ในจุดที่ฉันต้องการกำหนดชุดคุณสมบัติ (สมมติว่าวัตถุที่ไปเป็นพารามิเตอร์การก่อสร้างของคลาส) ถูกและดีมีการกำหนดคุณสมบัติทั้งหมดของการก่อสร้างไว้ในที่เดียว น่าเสียดายที่รหัสของฉันมีโมดูลจำนวนมากที่เอื้อต่อคุณสมบัติการก่อสร้างนั้น การทำอะไรบางอย่างเช่นการมิกซ์อินหรือคลาสย่อยที่เหมาะสมจะเป็นการลงน้ำ! ดังนั้นถ้าฉันสามารถฉีดเข้าไปในคำจำกัดความรายการคุณสมบัติได้ก็จะดีมาก
Shamasis Bhattacharya

ปัญหาที่คล้ายกันอีกประการหนึ่งที่ฉันกำลังเผชิญ แต่เมื่อมีรายการทรัพย์สินแบบกระจายคือstackoverflow.com/questions/19113571/…
Shamasis Bhattacharya

แนวทางแก้ไขทั้งหมดด้านล่างบังคับให้เราสร้าง Enum มีการร้องขอคุณสมบัติการใช้งานที่ GitHub ที่จะทำให้กระบวนการนี้ง่ายมากคือgithub.com/jsdoc3/jsdoc/issues/629 ดังนั้นใครที่ชอบมันควรจะกระแทกมัน
B12Toaster

คำตอบ:


26

วิธีการประกาศ Dummy enum:

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

อย่างน้อยคุณต้องประกาศ enum ต่อ JSDOC สำหรับสิ่งนี้แม้ว่า แต่รหัสนั้นสะอาดและคุณได้รับการเติมข้อความอัตโนมัติใน WebStorm

ปัญหาหลายไฟล์ไม่สามารถแก้ไขได้ด้วยวิธีนี้


ใช่. วิธีการแจงนับเป็นวิธีเดียวที่ฉันเห็น อย่างไรก็ตามฉันยอมรับว่านี่เป็นคำตอบเดียวที่ใช้งานได้ - เนื่องจากปัญหาหลายไฟล์เป็นอีกเรื่องหนึ่งโดยสิ้นเชิง!
Shamasis Bhattacharya

ปัญหาของแนวทางนี้คือไม่อนุญาตให้บันทึกค่าแต่ละค่า ฉันมีปัญหากับ JSDoc github.com/jsdoc3/jsdoc/issues/1065
Gajus

112

เมื่อปลายปี 2014ใน jsdoc3 คุณมีความเป็นไปได้ที่จะเขียน:

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

แน่นอนว่าสิ่งนี้จะไม่สามารถนำมาใช้ซ้ำได้เหมือนกับ enum เฉพาะ แต่ในหลาย ๆ กรณี dummy enum จะเกินความจำเป็นหากใช้เพียงฟังก์ชันเดียว

ดูเพิ่มเติม: https://github.com/jsdoc3/jsdoc/issues/629#issue-31314808


4
นี่เป็นทางออกที่ดีกว่าหากคุณรู้ว่าประเภทพารามิเตอร์จะไม่มีวันเปลี่ยนแปลง
Luca Steeb

1
ทางออกที่ดีที่สุดในมุมมองของฉัน! ขอบคุณ.
AJC24

26

สิ่งที่เกี่ยวกับ:

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

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

ป้อนคำอธิบายภาพที่นี่


9

ฉันไม่คิดว่ามีวิธีการเขียนอย่างเป็นทางการของค่าอนุญาตให้ใช้ในJSDoc

แน่นอนคุณสามารถเขียนบางอย่าง@param {String('up'|'down'|'left'|'right')}เช่นผู้ใช้b12toasterกล่าวถึง

ป้อนคำอธิบายภาพที่นี่

แต่โดยการอ้างอิงจากAPIDocjsนี่คือสิ่งที่ฉันจะใช้สำหรับการเขียนค่า จำกัด อาคาallowedValues

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

ใช่ฉันใช้ ES6


0

นี่คือวิธีที่ Closure Compiler รองรับ: คุณสามารถใช้ "@enum" เพื่อกำหนดประเภทที่ จำกัด ได้ คุณไม่จำเป็นต้องกำหนดค่าในนิยาม enum ตัวอย่างเช่นฉันอาจกำหนดประเภท "จำนวนเต็ม" เช่น:

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

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

โดยทั่วไป Int จะกำหนดให้กับ "number" (คือตัวเลข) แต่ "number" ไม่สามารถกำหนดให้กับ "Int" ได้หากไม่มีการบังคับ (การร่าย)


แต่นั่นไม่ได้ จำกัด Intค่าเป็นไปได้ของ นั่นเป็นส่วนที่ฉันไม่แน่ใจว่าเป็นไปได้
Chad Killingsworth

มันทำมากพอ ๆ กับคำอธิบายประกอบหรือ enum ประเภทอื่น ๆ ใน JS ข้อ จำกัด นั้นมาจากวิธีที่คุณเขียนโค้ด: "แคสต์" ทุกตัวจะเป็นธงสีแดง หากคุณ จำกัด การร่ายให้เป็นค่าโรงงานคุณจะได้สิ่งที่ต้องการ: คุณไม่สามารถกำหนด 'number' เป็น 'Int' โดยไม่มีคำเตือน
John

แต่ยังไม่ จำกัด ค่าของ {Int} :-(
Shamasis Bhattacharya

แน่นอนว่าคุณ จำกัด ค่าของ Int โดย จำกัด วิธีสร้างและข้อ จำกัด จะเสร็จสิ้นเมื่อสร้างค่า ไม่สามารถกำหนดหมายเลขดิบซึ่งเป็นสิ่งที่คุณต้องการทั้งหมด
John
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.