Строгая типизация атрибутов

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 поддерживает несколько режимов преобразования атрибутов:

  1. string (по умолчанию) Любое значение атрибута интерпретируется как строка. Преобразование в другой тип не выполняется.

  2. boolean (mode: 'boolean') Присутствие атрибута без значения или с пустым значением интерпретируется как true. Удаление атрибута — false.

  3. number (converter: Number) Значение атрибута автоматически преобразуется в число. Если преобразование невозможно — присваивается NaN.

  4. 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>
`;

Это обеспечивает строгий контроль типов и гарантирует, что шаблон всегда получает данные нужного формата.


Практические рекомендации

  1. Использовать строгие типы для всех свойств, которые влияют на отображение или поведение.
  2. Для булевых значений всегда указывать mode: 'boolean'.
  3. Для чисел и сложных структур использовать конвертеры, чтобы избежать некорректных данных.
  4. Проверять корректность данных внутри кастомных конвертеров и при необходимости выбрасывать ошибки или возвращать значения по умолчанию.

Строгая типизация атрибутов в FAST Element обеспечивает надежность компонентов, упрощает поддержку кода и предотвращает типовые ошибки на этапе разработки. Она тесно интегрирована с реактивной системой, позволяя создавать гибкие и безопасные веб-компоненты.