TypeScript + React

Тема дорожной карты · React

TypeScript и React — доминирующая комбинация для создания продакшн-grade фронтенд-приложений: TypeScript обеспечивает статическую проверку типов, выявляя несоответствия пропсов компонентов, неверное использование хуков и ошибки форм данных на этапе компиляции, а не во время выполнения. Для настройки TypeScript с React требуется tsconfig.json с "jsx": "react-jsx" (или "preserve" для Next.js), а также пакеты @types/react и @types/react-dom, предоставляющие определения типов для всех React API. В TypeScript React-проекте компоненты определяются в файлах .tsx, пропсы типизируются через интерфейсы, хуки вроде useState<T> выводят или принимают явные параметры типов, а React.FC или обычные сигнатуры функций с типизированными аргументами — одинаково приемлемые паттерны для определений компонентов. Структурная типизация TypeScript позволяет компоновать типы пропсов компонентов с помощью утилитарных типов Partial<T>, Required<T>, Pick<T, K> и Omit<T, K> для создания гибких, но безопасных компонентных API. Сочетание TypeScript с React в проектах Next.js открывает дополнительные преимущества: типизированные пропсы page из getServerSideProps, типизированные обработчики API-маршрутов и типизированные params и searchParams App Router, — делая TypeScript необходимым для надёжного SSR и управления состоянием.

Как это работает

TypeScript + React типизирует props, state, refs и события компонентов. Function-компоненты типизируются как function C(props: Props): JSX.Element или const C: React.FC<Props> (последнее спорно — теперь предпочитают явный return type). Типы событий — из namespace React: React.MouseEvent<HTMLButtonElement>, React.ChangeEvent<HTMLInputElement>. Generics делают компоненты переиспользуемыми между типами: function Select<T>(props: {items: T[], onChange: (item: T) => void}). Utility-типы (Partial, Pick, Omit, Required) производят выводные типы props из существующих.

Когда применять

Добавляйте TypeScript в любой новый React-проект >~500 строк или с >1 автором — фрикция минимальна, безопасность огромна. Типизируйте props явно (interface Props {...}); избегайте any и as-кастов (escape hatches, скрывают баги). Generics — для переиспользуемых list/select/form-компонентов. Опирайтесь на strict mode/strictNullChecks — они ловят тихие undefined-баги, которые скрывает чистый JavaScript.

Типичные ошибки

Ловушки TypeScript + React: any повсюду, потому что типизировать было сложно (теряете смысл — чините или используйте unknown); as Type-касты, лгущие компилятору; не сужающийся ReactNode (рендерится всё, включая случайные boolean); борьба с inference у useState для nullable значений (useState<User|null>(null) — явно); сверхсложные generic-constraints в shared-компонентах. Когда типы больно — больно и дизайну: рефакторите, не кастуйте.

Связанные понятия

Полезные ресурсы