20

Is it possible to have dynamic keys (prop names) in a jsdoc typedef? I'm imagining this would look something like the example below (which does not work).

@typedef {Object} Foo
@property {string} bar
@property {*} *

Passing properties not listed in the typedef e.g. {baz: 0} makes typescript upset with something like,

Argument of type '{ bar: string; baz: number; }' is not assignable to parameter of type 'Foo'. Object literal may only specify known properties, and 'baz' does not exist in type 'Foo'


Using the method proposed by @jcalz Object.<string, *> seems closer to the ideal output but resulted in a strange output
@typedef {Object} Foo
@property {number} bar
@property {Object.<string, *>}

output:

type Foo = {
    bar: number;
    (Missing): {
        [x: string]: any;
    };
}
J'e
  • 3,014
  • 4
  • 31
  • 55
  • Maybe use something like `Object.` instead of `Object`, as mentioned [here](https://github.com/Microsoft/TypeScript/wiki/JSDoc-support-in-JavaScript#type)? – jcalz May 20 '19 at 18:47
  • @jcalz, I wasn't able to make that work. I added the result to the post – J'e May 21 '19 at 12:34
  • 1
    Sorry, I've never really used JSDoc before. I was suggesting replacing `Object` in the first line with `Object.`, and that works to add an index signature, but it breaks when you add `bar`. The only thing I have seen that works is `/**@typedef { {[k: string]: any, bar: string } } Foo */`, but that's basically just using TypeScript type syntax instead of JSDoc. – jcalz May 21 '19 at 13:00

1 Answers1

5

You can also use normal TS syntax in JSDOC.

See next example:

/**
 * 
 * @param {Record<string, string> & {bar:string}} arg
 */
const foo = (arg) => {}

You can even use utility types:

/**
 * 
 * @param {Partial<{age:number}>} arg 
 */
const partial = (arg) => { }

You can find more utils here