Javascript JsDoc:如何记录对象可以具有任意(未知)属性,但具有特定类型?
这是一个类似于。我想表达的是,函数的参数是一个普通的JS对象,它可以有任意属性(未知)名称,但所有属性本身都是具有固定属性的对象 举个例子:函数就是这样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:
/**
* @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
*/