Коротка відповідь
middleТипізація в React — це спосіб забезпечити статичну перевірку типів компонентів, пропсів і стану, що знижує кількість runtime‑помилок. У TypeScript це реалізується через інтерфейси, типи пропсів і useState<T>, що робить код більш самодокументованим. У бібліотеках, як Next.js 14/15, типізація інтегрується через getServerSideProps / getStaticProps, що дозволяє типово передавати дані між сервером і клієнтом.
Повне пояснення
Що це і навіщо
- Типізація в React — застосування статичної типізації (наприклад, TypeScript) до компонентів, пропсів, стану і контексту. Це допомагає виявляти помилки ще на етапі компіляції, покращує автодоповнення і документацію.
Ключові принципи
Propsтипізуються через інтерфейси або типи:interface ButtonProps { onClick: () => void; label: string; }.Stateтипізується у функціональних компонентах черезuseState<T>().- Типізація контексту:
const ThemeContext = createContext<Theme | undefined>(undefined);. - Типізація хуків:
useEffect(() => { /* ... */ }, [deps]);– залежності типізуються автоматично.
Як це працює
- TypeScript компілює JSX у JavaScript, перевіряючи типи пропсів і стану. Якщо передається неправильний тип, компілятор видає помилку.
- У Next.js 14/15 типізація
getServerSidePropsіgetStaticPropsзабезпечує, що дані, які передаються в компонент, мають очікуваний тип.
Практика і реалізація
interface CardProps {
title: string;
content?: string;
}
const Card = ({ title, content }: CardProps) => {
return <div>{title}{content && <p>{content}</p>}</div>;
};
const [count, setCount] = useState<number>(0);
Тестування
- Jest + React Testing Library:
render(<Card title="Hi" />);– перевірка, що пропс типу string. - Vitest:
expect(() => render(<Card title={123 as any} />)).toThrow();– перевірка типу.
Особливості в контексті React
- Функціональні компоненти: типізація пропсів і стану через
FC<Props>або просто інтерфейс. - Класові компоненти: типізація через
React.Component<Props, State>. - Context API: типізація контексту забезпечує безпечне використання значень.
Оптимізація та типові помилки
- Перевантаження пропсів: використання
React.memoз типами. - Невірний тип пропсу → помилка компіляції, а не runtime.
- Необхідність
any→ уникайте, використовуйте конкретні типи.
Диагностика
- Якщо компонент не рендериться: перевірте, чи тип пропсу відповідає очікуваному.
- Якщо TypeScript видає помилку про
undefined, перевірте, чи передається значення або використайте опціональний тип.
Альтернативи
- PropTypes (runtime) – менш строгий, але працює без TypeScript.
- Flow – інша статична типізація, менш поширена в React‑спільноті.
Часті помилки (8)
- Передача
anyзамість конкретного типу. - Необхідність обгортати компонент
React.memoбез типізації. - Відсутність дефолтних значень для пропсів →
undefined‑помилки. - Неправильне використання
useState<any>()→ втрата типізації. - Змішування класових і функціональних компонентів без відповідної типізації.
- Необхідність
as anyдля пропсів → приховує помилки. - Відсутність типу у контексті →
undefinedпри використанні. - Невірна типізація
getServerSideProps→ помилки при передачі даних.
Cheatsheet
interface Props {}– тип пропсів.const [state, setState] = useState<Type>(initial);– тип стану.const ctx = createContext<Type | undefined>(undefined);React.FC<Props>– тип функціонального компоненту.
Follow‑up питання
- Як працює типізація
React.memo? - Чому в Next.js важлива типізація
getStaticProps?