JSDoc: a nested @property with a type that does not parse drops every nested @property after it #65020
Description
Note
Investigated with Claude (via Claude Code); corrections welcome.
🔎 Search Terms
jsdoc, typedef, nested property, function(, TS1005
🕗 Version & Regression Information
- Works:
6.0.3 - Broken:
7.0.2,7.1.0-beta,7.1.0-dev.20261029.1
CHANGES.md says Closure-style function(...) types are no longer supported, so the TS1005 is expected. This issue is about what happens to the other @property tags in the same typedef.
💻 Code
tsconfig.json
{
"compilerOptions": { "allowJs": true, "checkJs": true, "noEmit": true, "strict": true },
"include": ["index.js", "check.ts"]
}index.js
/**
* @typedef Sig
* @property {object} Args
* @property {string} Args.name
* @property {function(string)=} Args.onSave
* @property {((v: string) => void)=} Args.onCancel
*/
export {};check.ts
import type { Sig } from './index.js';
export const a: Array<keyof Sig['Args']> = ['name'];
export const b: Array<keyof Sig['Args']> = ['onSave'];
export const c: Array<keyof Sig['Args']> = ['onCancel'];🙁 Actual behavior
check.ts(4,45): error TS2322: Type '"onSave"' is not assignable to type '"name"'.
check.ts(5,45): error TS2322: Type '"onCancel"' is not assignable to type '"name"'.
index.js(5,23): error TS1005: '}' expected.
onCancel is also missing, but its type has valid syntax. Every nested property after the one that does not parse is gone.
With flat properties (@property {function(string)=} onSave), only onSave is missing and onCancel is kept. So the problem is in recovery for nested Args.* properties.
🙂 Expected behavior
Only Args.onSave is affected. Args.onCancel is kept, as it is with flat properties.
Additional information about the issue
In real code the only error at the use site is that the property does not exist. For example, a component invocation reports 'onCancel' does not exist in type ..., in a different file from the TS1005. With many typedefs in a codebase, it is hard to connect the two.
Activity
timurzvural commentedon Oct 29, 2026
Opened #65029.
It recovers through leftover
(...)after an unparseable braced Closure-style type so the property name still parses, and keeps a missing-name nested@propertyas a child so later nested tags are not aborted. Includes a compiler regression and a parser unit test. Related alternative: #65022.