Для интеграции Chakra UI с проектом на TypeScript требуется установка основных пакетов:
npm install @chakra-ui/react @chakra-ui/theme-tools @emotion/react @emotion/styled framer-motion
npm install @types/react @types/react-dom --save-dev
После установки создаётся файл theme.ts для кастомизации
темы. Типизация в TypeScript позволяет использовать интерфейсы и типы,
обеспечивая автодополнение и проверку ошибок:
import { extendTheme, ThemeConfig } from "@chakra-ui/react";
const config: ThemeConfig = {
initialColorMode: "light",
useSystemColorMode: false,
};
const theme = extendTheme({ config });
export default theme;
В index.tsx или main.tsx необходимо
обернуть приложение в ChakraProvider:
import { ChakraProvider } from "@chakra-ui/react";
import theme from "./theme";
import ReactDOM from "react-dom";
import App from "./App";
ReactDOM.render(
<ChakraProvider theme={theme}>
<App />
</ChakraProvider>,
document.getElementById("root")
);
Chakra UI поставляется с встроенной поддержкой TypeScript. Все компоненты имеют строгие типы пропсов, что исключает ошибки передачи некорректных значений. Например, кнопка:
import { Button } from "@chakra-ui/react";
<Button colorScheme="teal" size="md" onCl ick={() => console.log("Clicked")}>
Нажми меня
</Button>
colorScheme и size строго типизированы, и
TypeScript выдаст ошибку, если указать недопустимое значение.
Для создания собственных компонентов с Chakra UI используют
forwardRef и ComponentProps:
import { Button, ButtonProps } from "@chakra-ui/react";
import { forwardRef } from "react";
interface MyButtonProps extends ButtonProps {
isSpecial?: boolean;
}
const MyButton = forwardRef<HTMLButtonElement, MyButtonProps>(
({ isSpecial, ...props }, ref) => (
<Button
ref={ref}
bg={isSpecial ? "purple.500" : "gray.500"}
{...props}
/>
)
);
Создание расширенной темы с типами позволяет гарантировать корректное использование цветов, шрифтов и размеров:
import { extendTheme, ThemeConfig, Theme } from "@chakra-ui/react";
interface CustomTheme extends Theme {
colors: {
brand: {
100: string;
500: string;
};
};
}
const customTheme = extendTheme({
colors: {
brand: {
100: "#f7caca",
500: "#d53f8c",
},
},
}) as CustomTheme;
TypeScript гарантирует, что использование brand.500 в
компоненте будет корректным:
<Button colorScheme="brand">Специальная кнопка</Button>
TypeScript позволяет безопасно создавать хуки, использующие контекст
Chakra UI, например, useDisclosure:
import { useDisclosure, UseDisclosureReturn } from "@chakra-ui/react";
const useModal = (): UseDisclosureReturn => {
const disclosure = useDisclosure();
return disclosure;
};
Использование строгих типов предотвращает ошибки при работе с
методами onOpen, onClose и
isOpen.
sx пропсамиChakra UI позволяет задавать стили через пропсы и объект
sx, который полностью типизирован:
<Box
sx={{
display: "flex",
alignItems: "center",
justifyContent: "space-between",
}}
>
Контент
</Box>
TypeScript контролирует корректность всех CSS-свойств, предотвращая опечатки и неверные значения.
Chakra UI поддерживает responsive-пропсы, типизированные через
ResponsiveValue:
import { Box } from "@chakra-ui/react";
<Box width={{ base: "100%", md: "50%" }} p={[2, 4, 6]}>
Адаптивный контейнер
</Box>
TypeScript проверяет, что width и p
принимают только допустимые значения.
styled и TypeScriptИспользование @emotion/styled с Chakra UI позволяет
создавать компоненты с типами пропсов:
import { Box, BoxProps } from "@chakra-ui/react";
import styled from "@emotion/styled";
interface CardProps extends BoxProps {
highlight?: boolean;
}
const Card = styled(Box)<CardProps>`
background-color: ${(props) =>
props.highlight ? props.theme.colors.teal[100] : props.theme.colors.gray[100]};
padding: 16px;
border-radius: 8px;
`;
TypeScript обеспечивает корректное использование всех пропсов при рендеринге:
<Card highlight>
Важная информация
</Card>
ComponentProps и forwardRef.TypeScript совместно с Chakra UI создаёт безопасную и предсказуемую среду разработки для React-приложений, позволяя разрабатывать сложные интерфейсы с гарантией корректности пропсов и стилей.