FAST Element — это библиотека для создания Web Components на основе современного JavaScript с использованием реактивного состояния и декларативного синтаксиса. Одним из ключевых аспектов при работе с FAST Element является строгая типизация свойств и событий, что позволяет создавать более предсказуемые и безопасные компоненты. Вывод типов в FAST Element тесно связан с TypeScript, который предоставляет механизм определения типов свойств, методов и событий, а также их автоматическую проверку.
Свойства компонента в FAST Element объявляются через декоратор
@attr или через объект конфигурации в классе компонента.
Тип свойства может быть явно указан с помощью TypeScript. Пример:
import { FASTElement, customElement, attr } from "@microsoft/fast-element";
@customElement({ name: "my-element" })
export class MyElement extends FASTElement {
@attr({ mode: "boolean" })
isVisible: boolean;
@attr
label: string;
@attr
count: number;
}
Здесь TypeScript автоматически выводит типы boolean,
string и number для соответствующих свойств.
Если тип не указан, FAST Element попытается привести значение из
атрибута к строке по умолчанию.
Особенности вывода типов:
mode.@attr({ mode: "boolean" }) гарантирует,
что любое значение, присвоенное isVisible, будет приведено
к булевому типу.FAST Element поддерживает реактивные свойства, которые отслеживают изменения и инициируют обновление DOM. Типизация таких свойств критична для предотвращения ошибок при привязке данных:
import { observable } from "@microsoft/fast-element";
export class ReactiveElement extends FASTElement {
@observable
items: string[] = [];
}
TypeScript автоматически выводит, что items — массив
строк. Любая попытка присвоить items = 42 приведёт к ошибке
компиляции.
Преимущества реактивной типизации:
push, map,
filter) благодаря строгому типу string[].События в FAST Element могут быть строго типизированы через
CustomEvent и generic-параметры. Пример:
export class EventElement extends FASTElement {
dispatchCustomEvent() {
const event: CustomEvent<{ id: number; name: string }> = new CustomEvent("item-selected", {
detail: { id: 1, name: "Item 1" },
bubbles: true,
composed: true,
});
this.dispatchEvent(event);
}
}
Здесь TypeScript выводит тип detail автоматически, что
позволяет безопасно получать данные при обработке события:
element.addEventListener("item-selected", (e) => {
const detail = (e as CustomEvent<{ id: number; name: string }>).detail;
console.log(detail.id, detail.name);
});
Типизация событий повышает читаемость кода и снижает вероятность ошибок при передаче сложных структур данных между компонентами.
FAST Element позволяет создавать слоты для размещения контента, и их можно типизировать при помощи TypeScript:
import { html, FASTElement, customElement } from "@microsoft/fast-element";
@customElement({ name: "slot-element" })
export class SlotElement extends FASTElement {
// тип для контента слота можно описать через дженерики или interface
}
Для сложных структур, например, передачи элементов с определёнными интерфейсами, можно использовать generics:
interface Card {
title: string;
content: string;
}
class CardSlotElement<T extends Card> extends FASTElement {
cards: T[] = [];
}
Такой подход позволяет создать универсальные компоненты с безопасной структурой данных.
import { FASTElement, customElement, attr, observable } from "@microsoft/fast-element";
interface User {
id: number;
name: string;
}
@customElement({ name: "user-card" })
export class UserCard extends FASTElement {
@attr
title: string;
@observable
users: User[] = [];
@attr({ mode: "boolean" })
editable: boolean;
addUser(user: User) {
this.users.push(user);
}
selectUser(userId: number) {
const user = this.users.find(u => u.id === userId);
if (user) {
const event: CustomEvent<User> = new CustomEvent("user-selected", { detail: user });
this.dispatchEvent(event);
}
}
}
В этом компоненте полностью соблюдена строгая типизация: атрибуты, реактивные свойства, методы и события. TypeScript выводит все типы автоматически, обеспечивая безопасное взаимодействие с компонентом.
@attr и реактивных свойств. Преобразование типов
осуществляется FAST Element автоматически.@observable свойства
строго типизированы, поддерживают автокомплит и безопасные операции с
данными.CustomEvent<T> обеспечивает безопасный доступ к
detail и предотвращает ошибки.Вывод типов в FAST Element сочетает возможности TypeScript и реактивной модели библиотеки, делая компоненты предсказуемыми, безопасными и удобными для разработки сложных интерфейсов.