Haunted — это библиотека для создания веб-компонентов с использованием функционального подхода и реактивного состояния на основе Hooks. Одним из важных аспектов работы с Haunted является правильное управление типами данных, особенно при передаче свойств (props) компонентам и работе с внутренним состоянием. Преобразование типов играет ключевую роль в обеспечении корректного рендеринга и предсказуемого поведения.
В Haunted компоненты обычно определяются как функции:
import { html, component } from 'haunted';
function MyComponent({ count }) {
return html`<p>Количество: ${count}</p>`;
}
customElements.define('my-component', component(MyComponent));
Свойства, передаваемые через атрибуты HTML, всегда приходят в виде строк. Например:
<my-component count="10"></my-component>
В этом случае count будет строкой "10", а
не числом. Если требуется арифметическая обработка, необходимо выполнить
преобразование:
const numericCount = Number(count);
Важно учитывать возможные значения undefined или
некорректные строки:
const numericCount = count ? Number(count) : 0;
Булевые свойства чаще всего передаются через наличие атрибута, а не через значение:
<my-component disabled></my-component>
В Haunted можно использовать хелпер для обработки булевых значений:
const isDisabled = disabled !== null;
Если атрибут отсутствует, значение будет null, что
автоматически позволяет определить false.
Для более явного управления часто используют кастомный хук
useProp с проверкой типов:
import { useState, useEffect } from 'haunted';
function BooleanPropComponent({ active }) {
const [isActive, setIsActive] = useState(active === '' || active === 'true');
useEffect(() => {
setIsActive(active === '' || active === 'true');
}, [active]);
return html`<p>Состояние: ${isActive}</p>`;
}
При передаче сложных структур через атрибуты необходимо сериализовать их в JSON:
<my-component data='[1, 2, 3]'></my-component>
В компоненте:
const dataArray = JSON.parse(data || '[]');
Это обеспечивает корректное получение массивов или объектов, даже если атрибут отсутствует.
Для объектов предпочтительно использовать строгую проверку:
let configObject;
try {
configObject = JSON.parse(config || '{}');
} catch(e) {
configObject = {};
}
Haunted активно использует хуки useState для управления
состоянием. Тип значения состояния напрямую влияет на поведение
компонента:
import { useState } from 'haunted';
function Counter({ initial }) {
const [count, setCount] = useState(Number(initial) || 0);
return html`
<p>Счётчик: ${count}</p>
<button @click=${() => setCount(count + 1)}>+</button>
`;
}
Если initial не преобразовать к числу, любое сложение
будет конкатенацией строк.
Number()
или parseInt()/parseFloat(), учитывая проверку на NaN.'true'/'false'.JSON.parse() с
обработкой ошибок.String(value)
гарантирует корректный рендер в шаблоне.Пример комплексного компонента с безопасным приведением типов:
function UserCard({ name, age, active, tags }) {
const userAge = Number(age) || 0;
const isActive = active === '' || active === 'true';
let userTags = [];
try {
userTags = JSON.parse(tags || '[]');
} catch(e) {
userTags = [];
}
return html`
<div>
<h3>${String(name)}</h3>
<p>Возраст: ${userAge}</p>
<p>Активен: ${isActive}</p>
<ul>
${userTags.map(tag => html`<li>${String(tag)}</li>`)}
</ul>
</div>
`;
}
Haunted отлично сочетается с TypeScript, что позволяет явно задавать типы для props:
interface UserCardProps {
name: string;
age?: string | number;
active?: string | boolean;
tags?: string;
}
function UserCard({ name, age, active, tags }: UserCardProps) { ... }
TypeScript помогает предотвратить ошибки преобразования типов ещё на этапе компиляции, особенно при сложных структурах данных.
Правильное преобразование типов повышает стабильность компонентов Haunted, делает код более предсказуемым и облегчает интеграцию с HTML и TypeScript.