JSDoc - 记录混合数组

10
在JSDoc中,如何记录接受多个对象类的数组,像这样:
var arr = [new Foo(), new Bar()];

如何编写类型,使得FooBar是数组中唯一被接受的类?


这是正确的方式吗?/** @type {[Foo|Bar]} */ - Kevin Law
3
我相信你正在寻找 {Array.<Foo|Bar>} - Pandawan
2
另一个选项是 {(Foo|Bar)[]} - austin_ce
@KevinLaw [Foo|Bar] 的意思是一个包含一个元素的元组,该元素可以是 FooBar - dannymo
1个回答

14
如果第一个对象的类型始终应该是Foo,第二个对象始终应该是Bar,那么我们正在看作为元组对象所理解的内容。在这种情况下,正确的JSDoc类型应为: {[0]: Foo, [1]: Bar}
/** @type {[Foo, Bar]} */
const arr = [new Foo(), new Bar()];

与人们可能认为的不同,它不是 Array<Foo|Bar>,因为后者允许像 [new Foo(), new Foo()] 这样的东西,这可能是不想要的。


9
jsdoc 3.6.3(以及我假设的所有早期版本)中,这个语法是不合法的并会抛出错误。 - Captain_Obvious
有关这个 JSDoc 注释的官方文档在哪里可以找到?请参见 https://github.com/gajus/eslint-plugin-jsdoc/issues/495#issuecomment-590636289。 - Yves M.
我担心[Foo, Bar]被用于元组。即第一个元素为Foo,第二个元素为Bar的元组。 一个可以有多个FooBar的一般数组将是(Foo|Bar)[],正如@austin_ce所建议的那样。 - dannymo
1
你是正确的,@dannymo。如果你仔细阅读我的答案,你会发现它预设了每个位置具有预定类型的元组。对于类型可以在任何位置的数组,austin_ce的建议确实是正确的。 - Lucio Paiva
1
到了2022年,这个语法仍然是非法的。虽然 VSCode 可以处理这个语法,但 jsdoc CLI 不能。 - abulka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接