Типизация свойств формирует основу предсказуемого взаимодействия между компонентом и его окружением. Slim.js предоставляет механизм строгих и гибких свойств, обеспечивая контроль типов, значений по умолчанию и способов обновления интерфейса.
Свойства объявляются в статическом объекте props у
класса компонента. Каждое свойство описывается конфигурацией, где ключ —
имя свойства, а значение — объект с параметрами:
class Counter extends Slim {
static props = {
count: { type: Number, default: 0 },
title: { type: String },
enabled: { type: Boolean, default: true }
};
}
При создании компонента Slim.js анализирует предоставленные типы и значения, формируя внутренние реактивные поля и связанный атрибут DOM, если он задан.
Slim.js поддерживает примитивные типы Jav * aScript:
String, Number, Boolean,
Object, Array и Function. При
присвоении значения Slim.js выполняет преобразование для соответствия
объявленному типу. Например, для Boolean значения
"", "true" и "false" приводятся к
логическим.
Строковые свойства удобно использовать для простых текстовых значений и отображения в шаблоне. В случае передачи атрибутов DOM все значения считаются строковыми, и Slim.js попытется конвертировать их, если тип определён другим образом.
Числовые свойства автоматически парсятся с помощью
Number(). Если парсинг неудачен, значение становится
NaN. Для компонентов интерфейса часто используются числовые
свойства для индексов, размеров, счётчиков и идентификаторов.
Логические свойства учитывают особенности HTML-атрибутов. Наличие
атрибута без значения интерпретируется как true. Передача
строки "false" даёт логическое false. Такой
подход упрощает управление состоянием включено/выключено.
Сложные типы полезны для хранения структурированных данных. Slim.js не клонирует такие значения глубоко, поэтому совместное использование ссылочных типов требует аккуратности. Изменения массива или объекта не всегда инициируют автоматический ререндер, что стимулирует практику явного обновления свойства.
Функциональные свойства применяются для передачи колбэков. Slim.js не модифицирует такие значения, а обеспечивает реактивное связывание и вызов в контексте компонента, когда это необходимо.
Значение по умолчанию задаётся через ключ default. Оно
используется, если внешнее окружение не предоставило значения. Для
сложных типов рекомендуется задавать фабричную функцию, чтобы избежать
общих ссылок:
items: { type: Array, default: () => [] }
Такой подход гарантирует, что каждый экземпляр компонента получит независимую структуру.
Если свойство соответствует имени атрибута, Slim.js создаёт двухстороннее связывание. Значения, полученные через атрибуты, проходят преобразование к типу, указанному в конфигурации. Это позволяет лаконично описывать API компонента через HTML:
<counter count="10" enabled></counter>
При изменении типизированного свойства Slim.js инициирует обновление связанного фрагмента шаблона. Для сложных типов обновление может не происходить автоматически при изменении вложенных данных, поэтому предпочтительно обновлять свойство целиком:
this.items = [...this.items, newItem];
Такое присваивание запускает реактивный цикл и приводит к обновлению отображения.
Slim.js предполагает, что типизация служит не только для удобства, но
и для защиты API. При некорректных значениях компонент продолжает
работу, но оставляет преобразованное значение или
undefined. Практика явной проверки значений на уровне
компонента помогает поддерживать надёжные инварианты.
Традиция типизации свойств в Slim.js поддерживает строгий контракт между внешним HTML и внутренней JavaScript-логикой. Такой механизм формирует предсказуемые компоненты, ясную модель данных и облегчает интеграцию в крупные проекты.