Вместо того, чтобы использовать утверждение типа, защиту типа или any
для обхода проблемы, более элегантным решением было бы использование generics для указания типа выбираемого элемента.
К сожалению, getElementsByName
не является общим, но querySelector
и querySelectorAll
являются общими. (querySelector
и querySelectorAll
также гораздо более гибкие и поэтому могут быть предпочтительнее в большинстве случаев.)
Если вы передадите только имя тега в querySelector
или querySelectorAll
, оно будет автоматически набрано правильно благодаря следующей строке в lib.dom.d.ts
:
querySelector<K extends keyof HTMLElementTagNameMap>(selectors: K): HTMLElementTagNameMap[K] | null;
Например, чтобы выбрать первый тег скрипта на странице, как в вашем вопросе, вы можете:
const script = document.querySelector('script')!;
Вот и все - TypeScript теперь может сделать вывод, что script
теперь HTMLScriptElement
.
Используйте querySelector
, когда вам нужно выбрать один элемент. Если вам нужно выбрать несколько элементов, используйте querySelectorAll
. Например:
document.querySelectorAll('script')
приводит к типу NodeListOf<HTMLScriptElement>
.
Если вам нужен более сложный селектор, вы можете передать параметр типа, чтобы указать тип элемента, который вы собираетесь выбрать. Например:
const ageInput = document.querySelector<HTMLInputElement>('form input[name="age"]')!;
приводит к тому, что ageInput
набирается как HTMLInputElement
.
person
CertainPerformance
schedule
11.08.2020