如何使用内联JSDoc指示param是可选的?

stu*_*eek 107 javascript google-closure-compiler jsdoc

根据@param的JSDoc wiki,您可以指示@param是可选的

/**
    @param {String} [name]
*/
function getPerson(name) {
}
Run Code Online (Sandbox Code Playgroud)

并且您可以指示内联使用的参数

function getPerson(/**String*/ name) {
}
Run Code Online (Sandbox Code Playgroud)

我可以将它们组合起来,如下所示,它可以正常工作.

/**
    @param [name]
*/
function getPerson(/**String*/name) {
}
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有办法在可能的情况下全部内联.

cze*_*rny 111

官方文件:

可选参数

一个名为foo的可选参数.

@param {number} [foo]
// or:
@param {number=} foo
Run Code Online (Sandbox Code Playgroud)

可选参数foo,默认值为1.

@param {number} [foo=1]
Run Code Online (Sandbox Code Playgroud)

  • 我在问如何内联.您提供的示例似乎与我在问题中显示的示例相同. (5认同)

vvM*_*Ovv 61

经过一番挖掘后,我发现这些也没问题

/**
 * @param {MyClass|undefined}
 * @param {MyClass=}
 * @param {String} [accessLevel="author"] The user accessLevel is optional.
 * @param {String} [accessLevel] The user accessLevel is optional.
 */
Run Code Online (Sandbox Code Playgroud)

只是略微视觉上吸引力 function test(/**String=*/arg) {}

  • 这些是有效的(并在JSDoc帮助中记录),但它们不是**内联** - 这是我正在寻找的. (7认同)

stu*_*eek 48

我找到了一种使用Google Closure Compiler 类型表达式来实现此目的的方法.你在类型之后放了一个等号: function test(/**String=*/arg) {}

  • WebStorm/IntellIDEA支持这种表示法 (10认同)
  • @PeterAronZentai,我将添加WebStorm/IntelliIDEA支持它,因为我为它添加了一个功能请求:).他们现在支持大多数Google Closure Compiler类型表达式,这非常棒. (4认同)
  • 是的,所以我认为它已获得足够的认可,将其标记为答案. (3认同)

Tom*_*uer 5

如果您对函数参数使用内联类型注释,并且想知道如何在该表示法中将函数参数标记为可选,我发现只需为可选参数分配默认值即可。如果你想要默认值,undefined你也必须明确设置它,否则参数不会被标记为可选(即使它前面已经是可选参数):

function demo(
  /** @type {String} */ mandatory,
  /** @type {Number} */ optional1 = 0,
  /** @type {Number} optional2 = undefined,
)
Run Code Online (Sandbox Code Playgroud)

如果您将鼠标悬停demo在您的 IDE 中,您现在应该看到两者optional1optional2显示为可选。在 VSCode 中,由?参数名称(TypeScript 表示法)后表示。如果你= undefined从中删除,optional2你只会看到optional1可选的,这当然是无稽之谈,所以这里的默认值必须是明确的,就像我在上一段中提到的那样。