La API JSDoc dice que puede documentar objetos así:
{Object.<string, number>}y documento de tipo múltiple:
{(number|boolean)}Pero si trato de especificar un objeto que podría tener cadenas O números como clave, no funciona. VSCode/JSDoc solo informa el tipo como 'cualquiera'.
VSCode no entiende:
/** * Object with string or number for keys * @param {Object.<(string|number), any>} Container */ También probé esto en @typedef , o definí la clave en su propio @typedef sin ningún efecto.
Debido a que estoy usando & para obtener una intersection de tipos (como {Object.<string, any> & {'foo': number}} no quiero tener que usar el booleano o decir:
/** * Object with string or number for keys * @param {(Object.<string, any>|Object.<number, any>) & {'foo': number}} Container */El tipo documentado termina pareciéndose a algo como:
type Container = ({ [x: string]: any; } & { 'foo': number; }) | ({ [x: number]: any; } & { 'foo': number; })Lo cual es innecesariamente detallado.
¿Hay alguna manera de documentar esto con un resultado más sucinto?
En JavaScript, las claves de objeto son siempre cadenas (o, en el caso de los números, forzadas a cadenas), por lo que podría complicar las cosas innecesariamente. Consulte la especificación de ECMAScript en objetos :
Las propiedades se identifican mediante valores clave. Un valor de clave de propiedad es un valor de cadena ECMAScript o un valor de símbolo. Todos los valores de Cadena y Símbolo, incluida la Cadena vacía, son válidos como claves de propiedad. Un nombre de propiedad es una clave de propiedad que es un valor de cadena.
Un índice entero es una clave de propiedad con valor de cadena que es una cadena numérica canónica
Dicho esto, esta parece ser la solución más sencilla:
// Combined /** * @param {Object.<string, any> & {foo: number}} Container */ // Split/reusable /** * @typedef {Object.<string, any>} GenericObject * @param {GenericObject & {foo: number}} Container */Ambos resultados anteriores dan como resultado este tipo/documentación:
Container: { [x: string]: any; } & { foo: number; } Declarar Object.<string, any> me parece un poco redundante, ya que las claves de objeto son inherentemente string y los valores son inherentemente any , por lo que declararlo de esta manera no proporciona mucho valor a un desarrollador.