Библиотека Ant Design изначально проектировалась с поддержкой TypeScript, поэтому большинство компонентов имеет строгие и детально описанные типы. Это позволяет:
Типы охватывают:
Каждый компонент Ant Design экспортирует собственные типы, которые можно использовать напрямую в приложении.
Каждый компонент Ant Design имеет интерфейс свойств, описывающий допустимые параметры.
Пример использования компонента Button:
import { Button } from 'antd';
function App() {
return (
<Button type="primary" disabled>
Click
</Button>
);
}
Внутренне используется интерфейс:
interface ButtonProps {
type?: 'primary' | 'default' | 'dashed' | 'link' | 'text';
danger?: boolean;
ghost?: boolean;
disabled?: boolean;
loading?: boolean;
size?: 'small' | 'middle' | 'large';
onClick?: React.MouseEventHandler<HTMLElement>;
}
TypeScript обеспечивает:
Пример ошибки:
<Button type="blue" />
Компилятор сообщит:
Type '"blue"' is not assignable to type 'ButtonType'
Типы можно импортировать отдельно от компонентов.
import type { ButtonProps } from 'antd';
Это полезно при:
Пример:
const defaultButtonProps: ButtonProps = {
type: 'primary',
size: 'large'
};
Часто создаются обёртки вокруг компонентов Ant Design.
import { Button } from 'antd';
import type { ButtonProps } from 'antd';
interface SubmitButtonProps extends ButtonProps {
isSubmitting: boolean;
}
export const SubmitButton = ({ isSubmitting, ...props }: SubmitButtonProps) => {
return (
<Button loading={isSubmitting} type="primary" {...props} />
);
};
В результате:
Компоненты Ant Design используют стандартные типы React.
Пример обработчика клика:
import { Button } from 'antd';
const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
console.log(event.currentTarget);
};
<Button onCl ick={handleClick}>Click</Button>;
Тип события:
React.MouseEvent<HTMLButtonElement>
Это даёт доступ к:
targetcurrentTargetpreventDefault()stopPropagation()Некоторые компоненты Ant Design используют generics для типизации данных.
Наиболее известный пример — Table.
import { Table } from 'antd';
interface User {
id: number;
name: string;
age: number;
}
const columns = [
{
title: 'Name',
dataIndex: 'name'
},
{
title: 'Age',
dataIndex: 'age'
}
];
<Table<User> columns={columns} dataSource={data} />;
Generic <User> сообщает таблице тип данных
строки.
Это влияет на:
renderfilterssorterДля колонок существует тип ColumnsType.
import type { ColumnsType } from 'antd/es/table';
interface User {
id: number;
name: string;
age: number;
}
const columns: ColumnsType<User> = [
{
title: 'Name',
dataIndex: 'name'
},
{
title: 'Age',
dataIndex: 'age'
}
];
Теперь TypeScript проверяет:
Ошибка:
dataIndex: 'salary'
если поле отсутствует в интерфейсе.
Колонка таблицы может содержать функцию render.
const columns: ColumnsType<User> = [
{
title: 'Age',
dataIndex: 'age',
render: (age: number) => <b>{age}</b>
}
];
Типы параметров:
render(value, record, index)
Где:
value: значение поля
record: вся строка таблицы
index: индекс строки
Пример:
render: (age: number, user: User) => (
<span>{user.name}: {age}</span>
)
Компонент Form активно использует generics.
import { Form, Input } from 'antd';
interface LoginForm {
email: string;
password: string;
}
const [form] = Form.useForm<LoginForm>();
Теперь поля формы строго типизированы.
form.setFieldsValue({
email: 'test@mail.com'
});
Ошибка:
form.setFieldsValue({
username: 'test'
});
Поле формы связано с ключом интерфейса.
<Form<LoginForm>>
<Form.Item name="email">
<Input />
</Form.Item>
</Form>
TypeScript проверяет существование поля email.
Если указать:
name="username"
будет ошибка.
Компонент Sel ect поддерживает строгие типы значений.
import { Sel ect } fr om 'antd';
type Role = 'admin' | 'user' | 'moderator';
const options = [
{ value: 'admin', label: 'Admin' },
{ value: 'user', label: 'User' }
];
<Select<Role>
options={options}
onCha nge={(value) => console.log(value)}
/>
Тип value автоматически становится
Role.
Компонент загрузки файлов использует тип UploadFile.
import type { UploadFile } fr om 'antd/es/upload/interface';
const fileList: UploadFile[] = [];
Структура файла:
interface UploadFile {
uid: string;
name: string;
status?: 'error' | 'success' | 'done' | 'uploading' | 'removed';
url?: string;
percent?: number;
}
Модальное окно использует интерфейс ModalProps.
import type { ModalProps } from 'antd';
const modalConfig: ModalProps = {
title: 'Delete',
okText: 'Confirm',
cancelText: 'Cancel'
};
Использование:
<Modal {...modalConfig} />
Компонент message имеет строгие типы для
конфигурации.
import { message } from 'antd';
message.success({
content: 'Saved',
duration: 2
});
Тип:
interface ArgsProps {
content: ReactNode;
duration?: number;
icon?: ReactNode;
}
Меню использует тип MenuProps.
import type { MenuProps } from 'antd';
const items: MenuProps['items'] = [
{
key: 'home',
label: 'Home'
},
{
key: 'about',
label: 'About'
}
];
Это удобный способ извлечь вложенные типы.
Ant Design использует и экспортирует некоторые вспомогательные типы.
Пример извлечения типа из свойства:
type MenuItems = MenuProps['items'];
Это позволяет:
TypeScript utility-типы часто используются при работе с конфигурациями компонентов.
Пример:
type PartialButtonProps = Partial<ButtonProps>;
Теперь все поля становятся необязательными.
const config: PartialButtonProps = {
type: 'primary'
};
Типы можно расширять через наследование.
import type { InputProps } from 'antd';
interface CustomInputProps extends InputProps {
label: string;
}
Компонент:
const CustomInput = ({ label, ...props }: CustomInputProps) => (
<>
<label>{label}</label>
<Input {...props} />
</>
);
Иногда необходимо извлечь тип компонента.
import { Button } from 'antd';
type ButtonComponent = typeof Button;
Также можно получить тип props:
type Props = React.ComponentProps<typeof Button>;
Это полезно при создании обёрток.
Некоторые компоненты поддерживают ref.
import { Input } from 'antd';
import { useRef } from 'react';
const inputRef = useRef<InputRef>(null);
Тип:
import type { InputRef } from 'antd';
Использование:
inputRef.current?.focus();
Для таблиц тип данных источника:
interface Product {
id: number;
title: string;
price: number;
}
const data: Product[] = [
{ id: 1, title: 'Phone', price: 500 }
];
Использование:
<Table<Product>
rowKey="id"
columns={columns}
dataSource={data}
/>
TypeScript проверяет соответствие колонок и данных.
Особенность Ant Design — глубокая вложенная типизация:
Это позволяет безопасно строить сложные интерфейсы:
TypeScript становится полноценным инструментом документации API компонентов и значительно снижает вероятность ошибок в крупных React-приложениях.