【问题标题】:How to annotate an object with Function type that has variable number of arguments in JSDoc?如何在 JSDoc 中注释具有可变数量参数的函数类型的对象?
【发布时间】:2021-06-03 01:03:12
【问题描述】:

我得到以下代码:

/**
 * @type {function(boolean, string, ...*):void}
 */
exports.warn = createMacro(macro)

warn 是一个签名为 (arg1, arg2, ...arg3) 的函数。当我尝试在其他地方使用此方法时,WebStorm 和 VSCode 抱怨说,需要第三个参数而不是可选

根据此注释生成.d.ts 文件时,签名是正确的:arg0: boolean, arg1: string, ...args: any[] 如何修改注解,以便 IDE 不会抱怨缺少参数?

【问题讨论】:

    标签: javascript typescript jsdoc


    【解决方案1】:

    我找不到通过使用 @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}
    

    【讨论】:

    • 这不起作用。 IDE 认为它需要 2-3 个参数(当它可以接受 2 个或更多时)而且 .d.ts 文件的签名错误:export var warn: (arg0: boolean, arg1: string, arg2: any[] | undefined) => void;
    • 抱歉@sydd。我用几个替代方案更新了我的答案。
    • 谢谢,它有效!我猜这是一个 TS 语言服务器的错误?
    • 原来,这是一个 TS 错误,现在已修复:github.com/microsoft/TypeScript/pull/44864。预计与 TS 4.4.1 一起发布
    猜你喜欢
    • 2013-09-29
    • 2021-08-16
    • 1970-01-01
    • 2022-06-16
    • 2018-08-01
    • 1970-01-01
    • 2021-05-28
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多