Skip to content

Optional function parameter with any return type in jsdoc is treated as required #38551

Closed
@TimvdLippe

Description

@TimvdLippe

TypeScript Version: 4.0.0-dev.20200512

Search Terms: jsdoc, declaration, optional

Code

clazz.js:

export class Clazz {
  /**
   * @param {string=} optionalParam
   * @param {function():*=} optionalFunctionDeclaration
   */
  method(optionalParam, optionalFunctionDeclaration) {}
}

tsconfig.json:

{
  "compilerOptions": {
    "outDir": "lib",
    "declaration": true,
    "allowJs": true,
    "checkJs": true
  },
  "files": [
    "clazz.js"
  ]
}

Expected behavior:
The emitted declaration file is:

export class Clazz {
    /**
     * @param {string=} optionalParam
     * @param {function():*=} optionalFunctionDeclaration
     */
    method(optionalParam?: string | undefined, optionalFunctionDeclaration?: (() => any) | undefined): void;
}

Actual behavior:

> tsc --version && tsc -p tsconfig.json

Version 4.0.0-dev.20200512
vararg.js:6:25 - error TS1016: A required parameter cannot follow an optional parameter.

6   method(optionalParam, optionalFunctionDeclaration) {}
                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~


Found 1 error.

Note that the return type is * which is any in jsdoc. If we use a different return type, TS will compile successfully. For example, if we use ? as return type the following is emitted:

export class Clazz {
    /**
     * @param {string=} optionalParam
     * @param {function():?=} optionalFunctionDeclaration
     */
    method(optionalParam?: string | undefined, optionalFunctionDeclaration?: (() => unknown) | undefined): void;
}

Playground Link:

Related Issues: #37703

Metadata

Metadata

Assignees

Labels

Needs InvestigationThis issue needs a team member to investigate its status.

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions