Когда должна быть точка в дженериках JSDoc?

#javascript #jsdoc

#javascript #jsdoc

Вопрос:

Я вижу, что некоторые люди пишут JSDoc для дженериков JavaScript, подобных этому (с точкой):

 /** @param {Array.<Bar>} bars the bars that should be fooed*/
function foo(bars) {}
 

и другие подобные этому (без точки):

 /** @param {Array<Bar>} bars the bars that should be fooed*/
function foo(bars) {}
 

В чем смысл точки? Какая версия правильная? Когда я должен ее использовать, а когда нет?

Комментарии:

1. Связано, но не уверен, что это актуальная информация: github.com/jsdoc/jsdoc/issues/1375

Ответ №1:

С точки зрения синтаксиса все выражения этих типов допустимы при запуске jsdoc index.js

 /** @param {Array} x */
const a = x => x;

/** @param {Array.<string>} x */
const b = x => x;

/** @param {Array<string>} x */
const c = x => x;

/** @param {string[]} x */
const d = x => x;
 

Следует отметить, что компилятор закрытия Google, похоже, не распознает {<type>[]} выражение типа, например, если вы скомпилируете это:

 /** @param {string[]} x */
const a = x => x;
 

Вы получаете следующее предупреждение:

 JSC_TYPE_PARSE_ERROR: Bad type annotation. expected closing } See https://github.com/google/closure-compiler/wiki/Annotating-JavaScript-for-the-Closure-Compiler for more information. at line 1 character 18
/** @param {string[]} x */
                  ^
JSC_TYPE_PARSE_ERROR: Bad type annotation. expecting a variable name in a @param tag. See https://github.com/google/closure-compiler/wiki/Annotating-JavaScript-for-the-Closure-Compiler for more information. at line 1 character 18
/** @param {string[]} x */
                  ^
 

Посмотрите эту скрипку компилятора закрытия Google.

Проверка статического типа в VS Code будет жаловаться на последние три вызова функции:

 // @ts-check

/** @param {Array} x */
const a = x => x;

/** @param {Array.<string>} x */
const b = x => x;

/** @param {Array<string>} x */
const c = x => x;

/** @param {string[]} x */
const d = x => x;

a(['foo', 3]); // OK (we just need an array)
b(['foo', 3]); // ERR: 3 is not a string
c(['foo', 3]); // ERR: 3 is not a string
d(['foo', 3]); // ERR: 3 is not a string
 

Так что это в значительной степени похоже на это {Array.<string>} и {Array<string>} является одним и тем же.

Лично я бы предпочел {Array<string>} over {Array.<string>} . Почему? Точка . также является разделителем «пространства имен»:

 /** @namespace */
const Burrito = {};

/** @constructor */
Burrito.beef = function () {};

/** @param {Burrito.beef} x */
const a = x => x;

a("foo");
a(new Burrito.beef());
 

Компилятор закрытия Google выдаст предупреждение о первом вызове (второй вызов в порядке):

 JSC_TYPE_MISMATCH: actual parameter 1 of a does not match formal parameter
found   : string
required: (Burrito.beef|null) at line 10 character 2
a("foo");
  ^
 

Посмотрите эту скрипку компилятора закрытия Google.

Если {Array<string>} и {Array.<string>} действительно одно и то же (и я считаю, что это правда), то я бы предпочел первое последнему, чтобы значение . символа оставалось однозначным.

Ответ №2:

Согласно документации JSDoc синтаксис с точкой правильный. https://jsdoc.app/tags-type.html

Массив экземпляров MyClass.

 {Array.<MyClass>}
// or:
{MyClass[]}
 

Комментарии:

1. Также обратитесь к путям имен JSDoc; jsdoc.app/about-namepaths.html