Як задокументувати тип рядка в 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. Однак перелічення не підтримують додавання підтипів після оголошення в Closure-compiler.
Чад Кіллінгсворт,

@ChadKillingsworth Я розумію, що ти маєш на увазі. Я застряг у точці, де хочу визначити набір властивостей (скажімо, об’єкт, який є конструктивним параметром класу). Це добре і добре, якби всі властивості споруди були визначені в одному місці. На жаль, мій код має ряд модулів, що сприяють цим властивостям побудови. Робити щось на зразок міксину або підкласифікації власників було б занадто за бортом! Як такий, якби я міг просто внести визначення списку властивостей, було б чудово.
Шамасіс Бхаттачарія,

Інший подібний питання , який я зіткнувся, але з розподіленим лістингу нерухомості є stackoverflow.com/questions/19113571 / ...
Shamasis Бхаттачарія

Всі наведені нижче рішення змушують нас створити Enum. На GitHub є активний запит функції, щоб набагато спростити цей процес: github.com/jsdoc3/jsdoc/issues/629 . Тож будь-хто, кому це подобається, повинен, мабуть, натякати.
B12Тостер

Відповіді:


26

Як щодо оголошення фіктивного перерахування:

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

Вам потрібно хоча б оголосити перерахування в JSDOC, однак для цього. Але код чистий, і ви отримуєте автоматичне заповнення в WebStorm.

Проблему декількох файлів, однак, неможливо вирішити таким чином.


Так. Я бачу підхід до переліку - єдиний придатний для використання спосіб. У будь-якому випадку, я приймаю це як єдину корисну відповідь - оскільки проблема з кількома файлами - це зовсім інша історія!
Шамасіс Бхаттачарія

Проблема цього підходу полягає в тому, що він не дозволяє документувати окремі цінності. У мене проблема з 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;
};

Звичайно, це не буде настільки багаторазовим використанням, як спеціальне перерахування, але в багатьох випадках фіктивне перерахування є надмірним, якщо воно використовується лише однією функцією.

Дивіться також: 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 , ось що я використовую для написання обмежених значень, інакше дозволених значень .

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

О так, я використовую ES6.


0

Ось як підтримує компілятор закриття: ви можете використовувати "@enum", щоб визначити обмежений тип. Насправді вам не потрібно визначати значення у визначенні переліку. Наприклад, я можу визначити тип "цілого числа", наприклад:

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

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

Int, як правило, можна присвоїти "номеру" (це число), але "число" не можна призначити "Int" без певного примусу (приведення).


Але це не обмежує можливі значення Int. Це частина, я не впевнений, що це можливо.
Чад Кіллінгсворт,

Це робить стільки, скільки будь-яка інша анотація типу або перерахування в JS. Обмеження походить від того, як ви пишете код: кожен "кидок" - це червоний прапор. Якщо ви обмежите закиди значенням фабрик, то ви отримаєте те, що хочете: ви не можете призначити 'число' для 'Int' без попередження.
Джон

Він все ще не обмежує значення {Int}. :-(
Shamasis Bhattacharya

Звичайно, ви обмежуєте значення Int, обмежуючи спосіб його створення, і обмеження робиться, коли значення створюється. Неможливо призначити необроблений номер, що все, що вам потрібно.
Джон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.