Preact является легковесной альтернативой React и отлично сочетается с TypeScript, обеспечивая строгую типизацию и автодополнение при разработке. Конфигурация TypeScript для Preact имеет свои особенности, которые позволяют максимально эффективно использовать возможности фреймворка.
Для корректной работы Preact с TypeScript необходимо установить несколько ключевых пакетов:
npm install preact preact-hooks
npm install --save-dev typescript @types/preact @types/preact-compat
Основным файлом конфигурации TypeScript является
tsconfig.json. Для Preact он должен включать следующие
настройки:
{
"compilerOptions": {
"target": "ES6",
"module": "ESNext",
"lib": ["DOM", "ESNext"],
"jsx": "react-jsx",
"jsxImportSource": "preact",
"moduleResolution": "node",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true
},
"include": ["src"]
}
Ключевые моменты конфигурации:
"jsx": "react-jsx" — указывает TypeScript использовать
современный JSX-трансформер."jsxImportSource": "preact" — заменяет React на Preact
в трансформации JSX."strict": true — включает строгую типизацию, включая
noImplicitAny, strictNullChecks,
strictFunctionTypes и другие проверки."moduleResolution": "node" — необходим для корректного
поиска модулей в Node-проектах."esModuleInterop": true — упрощает импорт
CommonJS-модулей."skipLibCheck": true — ускоряет компиляцию, пропуская
проверку типов в сторонних библиотеках.Preact предоставляет типы для функциональных компонентов через
FunctionalComponent и JSX.Element. Пример
корректной типизации:
import { FunctionalComponent, h } from 'preact';
interface ButtonProps {
label: string;
onClick: () => void;
}
const Button: FunctionalComponent<ButtonProps> = ({ label, onClick }) => (
<button onCl ick={onClick}>{label}</button>
);
FunctionalComponent<Props> обеспечивает строгую
проверку передаваемых пропсов.interface или type для
пропсов позволяет легко расширять и переиспользовать компоненты.Для крупных проектов полезно настроить пути для импорта модулей:
{
"compilerOptions": {
"baseUrl": "./src",
"paths": {
"@components/*": ["components/*"],
"@utils/*": ["utils/*"]
}
}
}
Это позволяет использовать:
import Button from '@components/Button';
import { formatDate } from '@utils/date';
Вместо длинных относительных путей.
Preact Hooks имеют типы, совместимые с TypeScript. Например:
import { useState, useEffect } from 'preact/hooks';
const Counter: FunctionalComponent = () => {
const [count, setCount] = useState<number>(0);
useEffect(() => {
console.log(`Текущее значение: ${count}`);
}, [count]);
return <button onCl ick={() => setCount(count + 1)}>Увеличить: {count}</button>;
};
useState<number>)
повышает точность проверки типов.useEffect корректно работает с массивом зависимостей,
обеспечивая статическую проверку.Vite: один из популярных сборщиков для Preact +
TypeScript. Конфигурация vite.config.ts может выглядеть
так:
import { defineConfig } from 'vite';
import preact from '@preact/preset-vite';
export default defineConfig({
plugins: [preact()],
resolve: {
alias: {
react: 'preact/compat',
'react-dom': 'preact/compat'
}
}
});
@preact/preset-vite упрощает настройку
JSX-трансформера.strict режим в
tsconfig.json.any и использовать
unknown с последующей проверкой.@types/....Preact поддерживает контекст аналогично React. Пример:
import { createContext } from 'preact';
import { FunctionalComponent, h } from 'preact';
interface ThemeContextProps {
theme: 'light' | 'dark';
toggleTheme: () => void;
}
export const ThemeContext = createContext<ThemeContextProps | undefined>(undefined);
const ThemeProvider: FunctionalComponent = ({ children }) => {
const [theme, setTheme] = useState<'light' | 'dark'>('light');
const toggleTheme = () => setTheme(theme === 'light' ? 'dark' : 'light');
return (
<ThemeContext.Provider value={{ theme, toggleTheme }}>
{children}
</ThemeContext.Provider>
);
};
createContext<... | undefined> гарантирует, что
при использовании контекста TypeScript будет проверять его
доступность.Правильная конфигурация TypeScript для Preact обеспечивает строгую
типизацию, предсказуемое поведение компонентов и удобную интеграцию с
современными сборщиками. Использование strict режима,
правильных типов для пропсов и хуков, а также настройка путей и алиасов
формирует основу для масштабируемого и безопасного фронтенд-кода.