Начальный проект Typescript Lit Element включает это объявление глобального интерфейса внизу элемента примера:
declare global {
interface HTMLElementTagNameMap {
'my-element': MyElement;
}
}
Это необходимо? Для чего это используется?
Начальный проект Typescript Lit Element включает это объявление глобального интерфейса внизу элемента примера:
declare global {
interface HTMLElementTagNameMap {
'my-element': MyElement;
}
}
Это необходимо? Для чего это используется?
Это необходимо?
Нет, это объявление не требуется для работы вашего настраиваемого элемента на основе LitElement.
Для чего это используется?
Это особенность TypeScript, а не только LitElement.
Это объявление помогает TypeScript обеспечивать строгую типизацию при взаимодействии с DOM API. API JavaScript DOM, конечно, не знает и не заботится о типах, но TypeScript знает. С помощью этого механизма вы можете добавить тип ваших пользовательских элементов в DOM API.
Пример может лучше проиллюстрировать это. Предполагая этот очень простой настраиваемый элемент:
class HelloWorldElement extends HTMLElement {
name = 'world'; // public 'name' member with default value
// ... element internals left aside,
// just assume this.name is used somewhere ...
}
window.customElements.define('hello-world', HelloWorldElement);
Теперь рассмотрите возможность использования этого элемента с API DOM:
const el = document.createElement('hello-world');
// el has the very generic type HTMLElement
el.name = 'custom elements'; // error! HTMLElement has no member 'name'
TypeScript вам не позволит. У него нет возможности (пока) узнать, что имя тега hello-world
соответствует экземпляру HelloWorldElement
, поскольку оператор customElements.define(...)
выполняется во время выполнения, но безопасность типов проверяется во время компиляции.
Но если вы расширите объявление HTMLElementTagNameMap
, TypeScript будет знать тип элемента <hello-world></hello-world>
:
// with the added declaration
declare global {
interface HTMLElementTagNameMap {
'hello-world': HelloWorldElement;
}
}
const el = document.createElement('hello-world');
// el has type HelloWorldElement
el.name = 'custom elements'; // OK. HelloWorldElement has a string member 'name'
Если вы хотите узнать больше, вы найдете их в Руководстве по TypeScript < / а>.