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?
.