如何在 JSDoc 中注释具有可变参数数量的 Function 类型的对象?
How to annotate an object with Function type that has variable number of arguments in JSDoc?
我得到了以下代码:
/**
* @type {function(boolean, string, ...*):void}
*/
exports.warn = createMacro(macro)
warn
是一个函数,其签名为 (arg1, arg2, ...arg3)。当我尝试在其他地方使用此方法时,WebStorm 和 VSCode 抱怨说,第三个参数是必需的而不是可选的
根据此评论生成 .d.ts
文件时,签名是正确的:arg0: boolean, arg1: string, ...args: any[]
我怎样才能修改注释,这样 IDE 就不会抱怨缺少参数?
我无法通过使用 @type 的内联函数定义来解决您的问题。但是,您可以考虑一些具有一些缺点的替代方案。
第一种方式使用 JSDoc 语法,应该与任何读取它的工具兼容。我首先声明一个 @callback 函数类型,然后将变量的类型设置为它。通过将最后一个参数名称括在方括号中,该参数成为可选参数并且应该可以清除您的错误。
/**
* @callback WarnFunc
* @param {boolean} arg1
* @param {string} arg2
* @param {...*} [restParam]
* @returns void
*/
/** @type WarnFunc*/
exports.warn = createMacro(macro);
上面的问题是它比你以前的要冗长得多。 TypeScript 支持在 TypeScript 语法和 JSDoc 语法中定义的类型参数。因此,如果维护 JSDoc 的语法不是优先事项,则以下方法应该可行并且更简洁:
/**
* @type {(arg1: boolean, arg2: string, ...restArgs: string[]) => void}
*/
exports.warn = createMacro(macro);
我这样做时没有收到任何错误,但是 restArgs 参数也没有显示为可选参数。因此,如果您仍然有问题,可以显式地将其余参数设为可选。虽然它不是有效的 TypeScript 语法,但我尝试时它似乎有效。
@type {(arg1: boolean, arg2: string, ...restArgs?: string[]) => void}
我得到了以下代码:
/**
* @type {function(boolean, string, ...*):void}
*/
exports.warn = createMacro(macro)
warn
是一个函数,其签名为 (arg1, arg2, ...arg3)。当我尝试在其他地方使用此方法时,WebStorm 和 VSCode 抱怨说,第三个参数是必需的而不是可选的
根据此评论生成 .d.ts
文件时,签名是正确的:arg0: boolean, arg1: string, ...args: any[]
我怎样才能修改注释,这样 IDE 就不会抱怨缺少参数?
我无法通过使用 @type 的内联函数定义来解决您的问题。但是,您可以考虑一些具有一些缺点的替代方案。
第一种方式使用 JSDoc 语法,应该与任何读取它的工具兼容。我首先声明一个 @callback 函数类型,然后将变量的类型设置为它。通过将最后一个参数名称括在方括号中,该参数成为可选参数并且应该可以清除您的错误。
/**
* @callback WarnFunc
* @param {boolean} arg1
* @param {string} arg2
* @param {...*} [restParam]
* @returns void
*/
/** @type WarnFunc*/
exports.warn = createMacro(macro);
上面的问题是它比你以前的要冗长得多。 TypeScript 支持在 TypeScript 语法和 JSDoc 语法中定义的类型参数。因此,如果维护 JSDoc 的语法不是优先事项,则以下方法应该可行并且更简洁:
/**
* @type {(arg1: boolean, arg2: string, ...restArgs: string[]) => void}
*/
exports.warn = createMacro(macro);
我这样做时没有收到任何错误,但是 restArgs 参数也没有显示为可选参数。因此,如果您仍然有问题,可以显式地将其余参数设为可选。虽然它不是有效的 TypeScript 语法,但我尝试时它似乎有效。
@type {(arg1: boolean, arg2: string, ...restArgs?: string[]) => void}