Skip to content

JSDoc: a nested @property with a type that does not parse drops every nested @property after it #65020

Open

Description

@NullVoxPopuli

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

  1. timurzvural commented on Oct 29, 2026

    @timurzvural

    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 @property as a child so later nested tags are not aborted. Includes a compiler regression and a parser unit test. Related alternative: #65022.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions