一个名为foo的可选参数。
@param {number} [foo]
// or:
@param {number=} foo
@param {number} [foo=1]
经过一些搜寻,我发现这些也可以。
/**
* @param {MyClass|undefined}
* @param {MyClass=}
* @param {String} [accessLevel="author"] The user accessLevel is optional.
* @param {String} [accessLevel] The user accessLevel is optional.
*/
比function test(/**String=*/arg) {}
略微更具视觉吸引力。
我找到一种使用Google Closure Compiler的方式来实现这一点,即使用类型表达式。您可以在类型后面放置等号,如下所示:
function test(/**String=*/arg) {}
如果您正在使用函数参数的内联类型注释,而且想知道如何在该符号中标记函数参数为可选项,则我发现只需为可选参数分配默认值即可。但是如果您希望使用默认值为undefined
,则必须显式地设置它,否则即使它在已经标记为可选的参数之前,该参数也不会被标记为可选项:
function demo(
/** @type {String} */ mandatory,
/** @type {Number} */ optional1 = 0,
/** @type {Number} */ optional2 = undefined
)
demo
上,你应该会看到optional1
和optional2
现在都被标记为可选项了。在VSCode中,这通过参数名后面跟着一个?
符号(TypeScript注解)来表示。如果你从optional2
中移除= undefined
,你将只会看到optional1
被标记为可选项,这当然是不合理的,所以这里的默认值必须像我在上面的段落中所提到的那样显式地指定。最完整的答案将来自官方 TypeScript 文档。
// Parameters may be declared in a variety of syntactic forms
/**
* @param {string} p1 - A string param.
* @param {string=} p2 - An optional param (Google Closure syntax)
* @param {string} [p3] - Another optional param (JSDoc syntax).
* @param {string} [p4="test"] - An optional param with a default value
* @returns {string} This is the result
*/
由于TypeScript对JSDoc的处理方式,这是不可能的:https://github.com/microsoft/TypeScript/issues/47653
虽然你可以将参数标记为@type { ... | undefined }
,但它的可选性并没有改变,因为所有参数都是可选的。
你标记可选性/非可选性的方式是通过是否将参数名放在括号中,但在这种语法中没有参数名,所以只修改类型(而不是也以一种无法控制的方式修改可选性)是最直观的做法。
因此,在TS中,你必须使用外部的@param
注释块。