如何用有限的可能值在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中声明后添加子类型。
乍得·基林斯沃思2013年

@ChadKillingsworth我明白你的意思了。我被困在想要定义一组属性的地方(比如说一个对象,它作为类的构造参数)。如果将建筑物的所有属性都定义在一个位置上,那就太好了。不幸的是,我的代码中包含许多有助于该构造属性的模块。进行诸如mixin的操作或对财产所有者进行子类化将太过分了!这样,如果我可以简单地注入一个属性列表定义,那就太好了。
2013年

另一个类似的问题,我面对的,但分布式的财产清单是stackoverflow.com/questions/19113571/...
Shamasis巴塔查里亚

以下所有解决方案都迫使我们创建一个枚举。GitHub上有一个有效的功能请求,可以使此过程更加轻松:github.com/jsdoc3/jsdoc/issues/629。因此,任何喜欢它的人都应该碰它。
B12Toaster

Answers:


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中自动完成。

多文件问题虽然不能用这种方法解决。


是。枚举方法是我看到的唯一可用方法。无论如何,我接受这是唯一可用的答案-因为多文件问题完全是另一回事了!
Shamasis Bhattacharya

这种方法的问题在于它不允许记录各个值。我对JSDoc有问题。github.com/jsdoc3/jsdoc/issues/1065
Gajus 2015年

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
如果您知道参数类型永远不会改变,则这是一个更好的解决方案。
卡·斯蒂布

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 {number} */
var Int = {};

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

通常可以将Int分配给“数字”(它是一个数字),但是在没有强制(强制转换)的情况下,不能将“数字”分配给“ Int”。


但这并不限制的可能值Int。那是我不确定是否可能的部分。
乍得·基林斯沃思

它与JS中的任何其他类型注释或枚举一样多。限制来自您编写代码的方式:每个“ cast”都是一个危险信号。如果将强制转换限制为值工厂,那么您将获得所需的内容:没有警告就无法将“数字”分配给“整数”。
约翰,

它仍然没有限制{Int}的值。:-(
Shamasis Bhattacharya

当然可以,您可以通过限制Int的创建方式来限制Int的值,并在创建值时进行限制。无法分配您需要的原始编号。
约翰,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.