TypeScript играет ключевую роль в разработке с React Aria, обеспечивая строгую типизацию компонентов и хук-функций. Типы позволяют создавать предсказуемый интерфейс, предотвращают ошибки и улучшают автодополнение в редакторах кода.
Основные примитивные типы включают:
string — строки, например:
const label: string = "Submit";number — числа:
const count: number = 5;boolean — логические значения:
const isOpen: boolean = true;null и undefined — специальные значения,
используемые для отсутствующих данных.any — универсальный тип, позволяющий хранить значения
любого типа. Использование any рекомендуется
минимизировать.Пример в контексте React Aria:
import {useButton} from "@react-aria/button";
interface ButtonProps {
label: string;
isDisabled?: boolean;
}
export function MyButton(props: ButtonProps) {
const {buttonProps} = useButton(props);
return ;
}
Здесь label строго типизирован как string,
а isDisabled — как необязательный boolean.
Для описания сложных структур данных применяются
интерфейсы (interface) и типы
объектов (type). Они позволяют определять форму
пропсов, возвращаемых значений хуков и состояния компонентов.
interface MenuItem {
id: string;
name: string;
disabled?: boolean;
}
type MenuProps = {
items: MenuItem[];
onSelect: (item: MenuItem) => void;
};
Использование этих типов обеспечивает строгую проверку всех операций с элементами меню, включая обработку событий.
TypeScript поддерживает union (|) и
intersection (&) типов:
let key: string | number;
key = "Enter";
key = 13;
interface AriaButtonProps {
label: string;
}
interface StyleProps {
className?: string;
}
type ButtonProps = AriaButtonProps & StyleProps;
const button: ButtonProps = { label: "Click", className: "primary" };
Это удобно для расширения пропсов React Aria компонентов, добавляя стили или дополнительные атрибуты без дублирования кода.
Функции, возвращающие значения из React Aria хуков, требуют строгой типизации:
import {useMenu} from "@react-aria/menu";
import {AriaMenuProps} from "@react-aria/menu";
function MyMenu(props: AriaMenuProps
AriaMenuProps — универсальный тип, где
object описывает данные элементов меню.Generics () позволяют создавать универсальные
компоненты и хуки, работающие с любыми типами данных:
import {useListBox} from "@react-aria/listbox";
interface Option {
value: T;
label: string;
}
interface ListBoxProps {
options: Option[];
onSelect: (value: T) => void;
}
function ListBox({options, onSelect}: ListBoxProps) {
const {listBoxProps} = useListBox({items: options});
return (
{options.map(option => (
- onSelect(option.value)}>
{option.label}
))}
);
}
Использование generics обеспечивает строгую типизацию для любых элементов, будь то строки, числа или сложные объекты.
React Aria компоненты часто работают с событиями: клики, фокус, клавиши. TypeScript позволяет безопасно описывать типы событий:
function handleKeyPress(event: React.KeyboardEvent) {
if (event.key === "Enter") {
console.log("Button activated");
}
}
Тип React.KeyboardEvent
гарантирует доступ к свойствам клавиш (key,
code) без ошибок компиляции.
Для хранения состояния компонентов React Aria применяются типизированные хуки:
import {useToggleState} from "@react-stately/toggle";
const state = useToggleState({defaultSelected: false});
// state.selected имеет тип boolean
TypeScript проверяет все обращения к state.selected и
предотвращает присвоение некорректных типов.
Partial — делает все свойства объекта
необязательными.Readonly — делает свойства объекта доступными
только для чтения.Required — превращает все необязательные
свойства в обязательные.Пример с пропсами кнопки:
interface ButtonProps {
label: string;
isDisabled?: boolean;
}
type CompleteButtonProps = Required; // isDisabled становится обязательным
type OptionalButtonProps = Partial; // все поля необязательны
type ImmutableButtonProps = Readonly; // свойства только для чтения
Это удобно для разных сценариев использования React Aria компонентов, включая библиотечные расширения и кастомизацию.
Все типы интегрируются с JSX, что позволяет точно указывать типы пропсов компонентов:
TypeScript гарантирует, что label будет строкой, а
isDisabled — boolean, предотвращая ошибки при передаче
некорректных значений.