Что делает восклицательный знак для тега JSDoc @type? - PullRequest
0 голосов
/ 14 декабря 2018

VS Code анализирует следующее, как если бы не было восклицательного знака, без каких-либо ошибок:

const el = /** @type {HTMLElement!} */ (document.getElementById("abc"));

Что он делает?Официальная документация JSDoc гласит только о предшествующих отметках :

Указывает, что значение относится к указанному типу, но не может быть нулевым.

Неуверен в том, что делают исходящие оценки.

1 Ответ

0 голосов
/ 14 декабря 2018
const el = /** @type {HTMLElement!} */ (document.getElementById("abc"));

Тип актерского состава.Это говорит о том, что document.getElementById("abc") является элементом HTMLE, а не нулем.Скорее всего, аннотация была добавлена, потому что getElementById возвращает либо HTMLElement, либо значение null.

Автор этой строки должен быть на 100% уверен, что элемент с идентификатором ABC существует, поскольку послеПосле того, как приведение выполнено, Closure Compiler будет обрабатывать этот тип как HTMLElement, а не HTMLElement или null.

Типы, используемые при приведении, следуют тем же правилам, что и типы вне приведения.поэтому для демонстрации непосредственного использования этих типов в последующем не используется приведение.

Как говорит OP, в Closure Compiler восклицательный знак означает, что тип должен существовать и не может быть null.Кроме того, знак вопроса означает, что это может быть тип или это может быть null.

. Возьмем, к примеру, следующий код:

// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// @output_file_name default.js
// @formatting pretty_print
// ==/ClosureCompiler==

const body = document.querySelector('body');

const /** @export {Element!} */ n1 = body;
const /** @export {!Element} */ n2 = body;
const /** @export {Element} */ n3 = null;
const /** @export {?Element} */ n4 = null;
const /** @export {Element?} */ n5 = null;

console.log({
  n1,
  n2,
  n3,
  n4,
})

И пропустите его через ClosureКомпилятор , вот предупреждения, которые генерирует компилятор:

JSC_TYPE_MISMATCH: initializing variable
found   : (Element|null)
required: Element at line 3 character 37
const /** @export {Element!} */ n1 = body;
                                     ^
JSC_TYPE_MISMATCH: initializing variable
found   : (Element|null)
required: Element at line 4 character 37
const /** @export {!Element} */ n2 = body;
                                     ^

Обратите внимание, что body возвращается document.querySelector с типом {?Element}, который, как мы сказали, компилятор понимает, можетбыть либо Element, либо null, он же Element|null.Этот пример показывает, что обозначение также может быть выражено как ?Element или Element?.

...