FAST Element — это современный фреймворк для создания веб-компонентов, который позволяет организовать реактивное поведение элементов и управлять их атрибутами с высокой степенью контроля. Одной из ключевых возможностей является строгая типизация атрибутов, обеспечивающая безопасность данных и предсказуемость поведения компонентов.
В FAST Element каждое свойство класса компонента может быть связано с
атрибутом HTML. Свойства описываются через декоратор @attr
или с использованием статического объекта
observedAttributes. Пример базовой декларации свойства:
import { FASTElement, attr } from "@microsoft/fast-element";
class MyElement extends FASTElement {
@attr title;
@attr({ mode: 'boolean' }) active;
}
В этом примере:
title — строковый атрибут, который автоматически
синхронизируется с одноименным свойством класса.active — булевый атрибут. Передача true
или false через HTML автоматически преобразуется в
соответствующее значение свойства.Ключевое преимущество строгой типизации — предотвращение ошибок, связанных с неправильными типами данных.
FAST Element поддерживает несколько режимов преобразования атрибутов:
string (по умолчанию) Любое значение атрибута интерпретируется как строка. Преобразование в другой тип не выполняется.
boolean (mode: 'boolean')
Присутствие атрибута без значения или с пустым значением
интерпретируется как true. Удаление атрибута —
false.
number (converter: Number) Значение
атрибута автоматически преобразуется в число. Если преобразование
невозможно — присваивается NaN.
custom converter Для сложных случаев можно
задать собственный объект-конвертер с методами
fromAttribute и toAttribute:
@attr({
converter: {
fromAttribute(value) {
return value ? value.split(',').map(Number) : [];
},
toAttribute(value) {
return value.join(',');
}
}
}) numbers;
В этом примере атрибут numbers="1,2,3" автоматически
преобразуется в массив [1, 2, 3].
Свойства с атрибутами в FAST Element являются реактивными. Любое изменение значения свойства автоматически обновляет DOM, если используется биндинг:
html<MyElement>`
<div>${x => x.title}</div>
`;
Изменение this.title = "Новый заголовок" приведет к
обновлению содержимого <div> без дополнительных
действий.
Также можно отслеживать изменения через метод
propertyChanged:
class MyElement extends FASTElement {
title = "";
propertyChanged(name, oldValue, newValue) {
if (name === "title") {
console.log(`Значение title изменилось с ${oldValue} на ${newValue}`);
}
}
}
Строгая типизация атрибутов снижает риск некорректного использования компонентов:
"false" как
false — оно будет воспринимать только наличие или
отсутствие атрибута.NaN, предотвращая скрытые ошибки.Типизированные атрибуты упрощают работу с динамическим контентом и слотами. Например, можно передавать массив данных через атрибут и отображать его в шаблоне:
html<MyElement>`
<ul>
${x => x.numbers.map(n => html`<li>${n}</li>`)}
</ul>
`;
Это обеспечивает строгий контроль типов и гарантирует, что шаблон всегда получает данные нужного формата.
mode: 'boolean'.Строгая типизация атрибутов в FAST Element обеспечивает надежность компонентов, упрощает поддержку кода и предотвращает типовые ошибки на этапе разработки. Она тесно интегрирована с реактивной системой, позволяя создавать гибкие и безопасные веб-компоненты.