Slim.js — это лёгкая библиотека для создания веб-компонентов с реактивной привязкой данных. Одной из ключевых особенностей является строгая типизация шаблонов, которая обеспечивает безопасность данных, предотвращает ошибки и упрощает масштабирование приложений.
Строгая типизация в контексте Slim.js означает, что каждая переменная, используемая в шаблоне, имеет определённый тип, и попытка присвоить значение другого типа приведёт к ошибке на этапе компиляции или во время выполнения. Это позволяет:
Slim.js использует JavaScript Proxy и TypeScript аннотации, чтобы отслеживать типы данных внутри шаблонов и обеспечивать реактивное обновление DOM только при допустимых изменениях.
Каждый компонент Slim.js может иметь свойства, которые определяют реактивные данные. Типы этих свойств указываются через TypeScript или через атрибуты декларативно.
Пример строгого объявления типов через TypeScript:
import { Slim, component, prop } from 'slim-js';
@component('user-card')
class UserCard extends Slim {
@prop({ type: String }) name!: string;
@prop({ type: Number }) age!: number;
@prop({ type: Boolean, default: false }) active!: boolean;
}
Ключевые моменты:
@prop({ type: Type }) указывает ожидаемый тип
свойства.! после имени свойства гарантирует, что оно
инициализировано.В Slim.js шаблон определяется методом template или через
JSX-подобный синтаксис. Строгая типизация применима к любым динамическим
выражениям:
template() {
return `
<div class="user-card">
<h2>${this.name}</h2>
<p>Возраст: ${this.age}</p>
${this.active ? '<span>Активен</span>' : '<span>Неактивен</span>'}
</div>
`;
}
Здесь:
this.name строго соответствует
string.this.age строго соответствует number.this.age = 'двадцать', будет предотвращена.Slim.js отслеживает изменения свойств через Proxy, автоматически обновляя DOM. Строгая типизация позволяет фильтровать некорректные обновления:
this.age = 25; // допустимо, обновление DOM произойдёт
this.age = '25'; // ошибка типа, DOM не изменится
Механизм работает даже для массивов и объектов:
@prop({ type: Array }) friends!: string[];
this.friends.push('Alice'); // допустимо
this.friends.push(42); // ошибка типа
В Slim.js события могут быть типизированы для безопасной передачи данных между компонентами. Пример:
this.dispatchEvent(new CustomEvent<{ id: number, name: string }>('user-selected', {
detail: { id: 1, name: 'Alice' }
}));
Обработчик события может проверить тип:
this.addEventListener('user-selected', (e: CustomEvent<{ id: number, name: string }>) => {
console.log(e.detail.name); // гарантированно string
});
Для больших приложений рекомендуется использовать интерфейсы:
interface User {
id: number;
name: string;
email: string;
active: boolean;
}
@prop({ type: Object }) user!: User;
template() {
return `
<div>
<h3>${this.user.name}</h3>
<p>Email: ${this.user.email}</p>
<p>${this.user.active ? 'Активен' : 'Неактивен'}</p>
</div>
`;
}
Проверка типов гарантирует, что user всегда будет
соответствовать интерфейсу User, предотвращая случайные
ошибки доступа к несуществующим полям.
Строгая типизация интегрируется с TypeScript и современными редакторами, обеспечивая:
Строгая типизация превращает Slim.js из простой библиотеки для веб-компонентов в инструмент для создания безопасных и масштабируемых интерфейсов, позволяя уверенно работать с динамическими шаблонами и сложной реактивной логикой.