如何为具有不同类型键的对象编写 JSDoc?

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)

这是不必要的冗长。

有没有办法用更简洁的输出来记录这一点?

Mar*_*orn 9

在 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,因此以这种方式声明它不会为开发人员提供太多价值。