Qué hace esta herramienta
Una muestra JSON pasa a ser typedefs de JSDoc, un bloque por objeto.
{ "id": 1, "name": "Ada", "address": { "city": "Paris" } }
/**
* @typedef {Object} Root
* @property {number} id
* @property {string} name
* @property {Address} address
*/
/**
* @typedef {Object} Address
* @property {string} city
*/
Ponlos al principio de un archivo .js y cada @type {Root} de ese archivo queda comprobado: por tu editor, y por tsc --checkJs si lo ejecutas.
Una lista en la raíz también recibe nombre
/**
* @typedef {Array<UsersItem>} Users
*/
Ese bloque faltaba: una muestra en array producía solo el typedef del elemento, y el nombre raíz que habías puesto no iba a ninguna parte. Era un defecto real, encontrado al escribir esta página y corregido.
Los arrays se escriben siempre Array<…> y no …[]. Ambas formas valen; la larga sigue siendo legible cuando el tipo del elemento es una unión o un *.
Una clave que no es un identificador
{ "content-type": "text/html" }
* @property {string} "content-type"
Las comillas mantienen la clave legible, y no son JSDoc estándar: no existe sintaxis para un nombre de propiedad que no sea un identificador válido. Se dice en vez de callarse: nada en la salida te avisará, y un editor puede sencillamente ignorar esa línea. Una clave así conviene renombrarla en el origen.
Lo que una muestra no puede decidir
Cada propiedad se documenta como presente, porque es lo que el documento mostraba. JSDoc anota una opcional @property {string} [name] y una anulable {?string}: dos retoques que se hacen conociendo la API, no hechos contenidos en una sola carga.
Un valor desconocido pasa a *, el «cualquier tipo» de JSDoc. Aparece donde la muestra calla: un array vacío da Array<*>.
Privado por diseño
Todo se ejecuta localmente en tu navegador con JavaScript. Tus datos nunca se suben a un servidor, lo que hace que la herramienta sea segura para contenido sensible y funcione sin conexión.