Javascript JsDoc:如何记录对象可以具有任意(未知)属性,但具有特定类型?

Javascript JsDoc:如何记录对象可以具有任意(未知)属性,但具有特定类型?,javascript,documentation,jsdoc,jsdoc3,Javascript,Documentation,Jsdoc,Jsdoc3,这是一个类似于。我想表达的是,函数的参数是一个普通的JS对象,它可以有任意属性(未知)名称,但所有属性本身都是具有固定属性的对象 举个例子:函数就是这样 /** * @param {Descriptor} desc */ function foo( desc ) { // ... } 典型的desc如下所示 desc = { unknownEntity1: { priority: 5; writable: false; }, unknownEntity2:

这是一个类似于。我想表达的是,函数的参数是一个普通的JS对象,它可以有任意属性(未知)名称,但所有属性本身都是具有固定属性的对象

举个例子:函数就是这样

/**
 * @param {Descriptor} desc
 */
function foo( desc ) {
  // ...
}
典型的
desc
如下所示

desc = {
  unknownEntity1: {
    priority: 5;
    writable: false;
  },
  unknownEntity2: {
    priority: 42;
    writable: true;
  },
  unknownEntity3: {
    priority: 9;
    writable: false;
  }
}
我已经有了

/**
 * @typedef {Object} DescriptorEntry
 * @property {number} priority - The priority of the entity
 * @property {boolean} writable - True, if the entity can be modified
 */
对于
描述符
,我仍然需要一个
typedef
,它基本上表示描述符是一个具有任意属性的对象,但所有类型都是
DescriptorEntry
。作为伪代码,它类似于

/**
 * @typedef {Object} Descriptor
 * @property {DescriptorEntry} *
 */
当然,星号
*
作为“任何属性”的通配符是无效的Jsdoc语法。但是我如何正确地执行它呢?

根据,从JSDoc 3.2开始,JSDoc已经完全支持Google闭包编译器类型表达式。其中一种格式描述如下:

如果您希望有一个名为
DescriptorName
或类似的特殊类型,并详细说明允许的字符串值,您甚至可以将上述示例中的
string
替换为它自己的类型


然而,有一点值得注意。至少在我的例子中,虽然JSDoc没有拒绝后一种格式,但至少在默认模板中,它只是将其显示为一个“对象”,没有任何特殊的细节。但是,第一种格式显示正确。

这是
PropertyDescriptor
PropertyDescriptorMap
的类型脚本接口。(PhpStorm 2020也使用它们来完成代码):

接口属性描述符{
可配置?:布尔值;
可枚举?:布尔值;
价值?:任何;
可写?:布尔值;
获得?():任何;
集合?(v:任何):无效;
}
接口属性DescriptorMap{
[s:string]:PropertyDescriptor;
}
您可以将它们直接用作
@type{}
或重新定义两者:

/**
*@typedef{Object}PropertyDescriptor
*@property{function(v:*):void}[set]-set[name](v){…}仅限“访问器描述符”
*@property{function():*}[get]-get[name](){…}仅限“访问器描述符”
*@property{undefined |*}[value]-值(primitive | func)仅在“数据描述符”中有效
*@property{undefined | boolean}[writable]-可写仅在“数据描述符”中有效
*@property{undefined | boolean}[configurable]-可配置在“数据和访问器-描述符”中有效
*@property{undefined | boolean}[enumerable]-可枚举在“数据和访问器-描述符”中有效
*/
/**
*@typedef{Object}PropertyDescriptorMap
*/
/**
*@type{PropertyDescriptor}myDescriptor
*/
让myDescriptor={
对,,
可枚举:正确,
//值:{},
//可写:对,
获取myGet(){},
设置myGet(v){}
};

从2020.3.1起,这在PHPStorm中不起作用。当我为(让输入desc)执行
时,仍然会得到“自定义/继承属性上的可能迭代”诊断。
{Object.<string, number>}
/**
 * @typedef {Object.<string, DescriptorEntry>} Descriptor
 */
/**
 * @typedef {{string, DescriptorEntry}} Descriptor
 */