Библиотека Haunted предоставляет мощный инструмент для создания реактивных веб-компонентов с использованием хуков, вдохновленных React. Одним из ключевых преимуществ является возможность использования дженериков для хуков, что позволяет создавать типобезопасные и гибкие компоненты на TypeScript.
useStateХук useState в Haunted позволяет хранить состояние
компонента. В TypeScript его можно параметризовать через дженерик, что
обеспечивает строгую типизацию.
import { useState } from 'haunted';
function Counter() {
const [count, setCount] = useState<number>(0);
const increment = () => setCount(prev => prev + 1);
return html`
<button @click=${increment}>Count: ${count}</button>
`;
}
Ключевые моменты:
<number> указывает тип состояния.setCount("text") вызовет ошибку компиляции.interface User {
id: number;
name: string;
}
const [user, setUser] = useState<User | null>(null);
useReducerХук useReducer поддерживает полную типизацию действий и
состояния через дженерики:
interface State {
count: number;
}
type Action = { type: 'increment' } | { type: 'decrement' };
const [state, dispatch] = useReducer<State, Action>((state, action) => {
switch (action.type) {
case 'increment': return { count: state.count + 1 };
case 'decrement': return { count: state.count - 1 };
default: return state;
}
}, { count: 0 });
Преимущества:
State и Action предотвращает
ошибки при передаче некорректных действий.useEffectХук useEffect не принимает напрямую дженерики для типа
возвращаемого значения, но в Haunted его использование с типизированными
состояниями обеспечивает строгую типовую проверку:
const [data, setData] = useState<string[]>([]);
useEffect(() => {
fetch('/api/items')
.then(res => res.json())
.then((items: string[]) => setData(items));
}, []);
Особенности:
useState<string[]> гарантирует корректность типов
внутри эффекта.Haunted позволяет создавать кастомные хуки, которые могут быть полностью типизированы:
function useFetch<T>(url: string) {
const [data, setData] = useState<T | null>(null);
const [loading, setLoading] = useState<boolean>(true);
useEffect(() => {
fetch(url)
.then(res => res.json())
.then((result: T) => setData(result))
.finally(() => setLoading(false));
}, [url]);
return { data, loading };
}
interface Post {
id: number;
title: string;
}
const { data: posts, loading } = useFetch<Post[]>('/api/posts');
Преимущества использования дженериков в кастомных хуках:
Readonly или Partial для безопасного изменения
данных.useReducer с
дженериками, чтобы обеспечить строгую проверку действий и
состояния.Использование дженериков в хуках Haunted позволяет создавать типобезопасные, масштабируемые и поддерживаемые компоненты, интегрировать сложные состояния и унифицировать работу с данными. Это делает библиотеку удобной для крупных проектов на TypeScript, где строгая типизация критична.