Pur*_*ret 11 javascript jsdoc jsdoc3
JSDoc api 表示您可以像这样记录对象:
{Object.<string, number>}
Run Code Online (Sandbox Code Playgroud)
并记录多种类型:
{(number|boolean)}
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试指定一个可以将字符串或数字作为键的对象,则它不起作用。VSCode/JSDoc 仅将类型报告为“any”。
VSCode 不理解:
{Object.<string, number>}
Run Code Online (Sandbox Code Playgroud)
我也在 中尝试过这个@typedef,或者在它自己中定义密钥@typedef没有效果。
因为我用来&获取intersection类型(就像{Object.<string, any> & {'foo': number}}我不想使用布尔值或说:
{(number|boolean)}
Run Code Online (Sandbox Code Playgroud)
记录的类型最终看起来像这样:
type Container = ({
[x: string]: any;
} & {
'foo': number;
}) | ({
[x: number]: any;
} & {
'foo': number;
})
Run Code Online (Sandbox Code Playgroud)
这是不必要的冗长。
有没有办法用更简洁的输出来记录这一点?
在 JavaScript 中,对象键始终是字符串(或者,在数字的情况下,强制转换为字符串),因此您可能会不必要地使事情复杂化。请参阅关于对象的 ECMAScript 规范:
属性使用键值来标识。属性键值可以是 ECMAScript 字符串值或符号值。所有 String 和 Symbol 值(包括空 String)都是有效的属性键。属性名称是一个属性键,它是一个字符串值。
整数索引是一个字符串值属性键,它是一个规范的数字字符串
也就是说,这似乎是最直接的解决方案:
// Combined
/**
* @param {Object.<string, any> & {foo: number}} Container
*/
// Split/reusable
/**
* @typedef {Object.<string, any>} GenericObject
* @param {GenericObject & {foo: number}} Container
*/
Run Code Online (Sandbox Code Playgroud)
上述两种情况都会产生这种类型/文档:
Container: {
[x: string]: any;
} & {
foo: number;
}
Run Code Online (Sandbox Code Playgroud)
声明Object.<string, any>对我来说似乎有点多余,因为对象键本质上是strings ,值本质上是any,因此以这种方式声明它不会为开发人员提供太多价值。
| 归档时间: |
|
| 查看次数: |
7380 次 |
| 最近记录: |