Условные и отображаемые типы в React
Создавайте типы свойств компонентов, форма которых меняется в зависимости от значений других свойств, используя условные типы.
«Условные и отображаемые типы в React» — бесплатный урок React Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Основы условных типов
Условный тип использует синтаксис T extends U ? X : Y: если T совместим с U, типом становится X, иначе — Y.
type IsString<T> = T extends string ? true : false;
type A = IsString<string>; // true
type B = IsString<number>; // false
type C = IsString<'hello'>; // trueУсловные свойства на основе других свойств
Используйте условные типы, чтобы сделать свойство обязательным или необязательным в зависимости от значения другого свойства.
type InputProps<T extends 'text' | 'number'> = {
type: T;
} & (T extends 'number' ? { min?: number; max?: number } : { maxLength?: number });
const numInput: InputProps<'number'> = { type: 'number', min: 0, max: 100 };
const txtInput: InputProps<'text'> = { type: 'text', maxLength: 50 };Отображаемые типы
Отображаемые типы создают новый тип, преобразуя каждое свойство существующего типа. Синтаксис in keyof перебирает все ключи.
type Optional<T> = { [K in keyof T]?: T[K] };
type Readonly<T> = { readonly [K in keyof T]: T[K] };
type Nullable<T> = { [K in keyof T]: T[K] | null };Необязательные свойства для форм обновления
Используйте Partial<T> (встроенный отображаемый тип) для свойств формы обновления, где обязательны не все поля.
interface User { id: string; name: string; email: string; role: string; }
// Update form — all fields optional:
type UserUpdateProps = Partial<Omit<User, 'id'>>;
function UserUpdateForm(props: UserUpdateProps) {
// name, email, role are all optional
}Record с отображаемыми типами
Создавайте типы для поиска, в которых ключи берутся из объединения, а значения имеют согласованную структуру.
type Status = 'idle' | 'loading' | 'success' | 'error';
type StatusConfig = Record<Status, {
label: string;
icon: React.ReactNode;
color: string;
}>;
const statusConfig: StatusConfig = {
idle: { label: 'Ready', icon: <ReadyIcon />, color: 'gray' },
loading: { label: 'Loading...', icon: <Spinner />, color: 'blue' },
success: { label: 'Done', icon: <CheckIcon />, color: 'green' },
error: { label: 'Error', icon: <XIcon />, color: 'red' },
};Выбор обязательных ключей
Используйте условные типы с -? (удаляет признак необязательности), чтобы извлечь только обязательные ключи типа.
type RequiredKeys<T> = {
[K in keyof T]-?: undefined extends T[K] ? never : K;
}[keyof T];
interface FormData { name: string; email: string; phone?: string; }
type Required = RequiredKeys<FormData>; // 'name' | 'email'Шаблонные строковые типы
Шаблонные строковые типы объединяют строковые литеральные типы, позволяя типизировать имена событий, строки классов CSS и пути API.
type EventName = 'click' | 'change' | 'focus';
type HandlerName = `on${Capitalize<EventName>}`;
// 'onClick' | 'onChange' | 'onFocus'
type ApiPath<R extends string> = `/api/${R}`;
type UserPath = ApiPath<'users'>; // '/api/users'Условное извлечение свойств
Используйте Extract и Exclude, чтобы фильтровать типы-объединения.
type AllProps = 'onClick' | 'onHover' | 'onChange' | 'style';
type EventHandlers = Extract<AllProps, `on${string}`>;
// 'onClick' | 'onHover' | 'onChange'
type NonEventProps = Exclude<AllProps, `on${string}`>;
// 'style'Отображаемые типы для проверки форм
Создавайте типы ошибок проверки, соответствующие структуре данных формы, — по одной строке сообщения об ошибке на поле.
interface LoginForm { email: string; password: string; }
type FormErrors<T> = { [K in keyof T]?: string };
type LoginErrors = FormErrors<LoginForm>;
// { email?: string; password?: string }
const errors: LoginErrors = { email: 'Invalid email format' };Дискриминируемые отображаемые типы
Объединяйте отображаемые и условные типы, чтобы создавать типы, меняющие структуру в зависимости от дискриминатора.
type EventMap = {
click: { x: number; y: number };
keydown: { key: string; code: string };
resize: { width: number; height: number };
};
type Handler<E extends keyof EventMap> = (event: EventMap[E]) => void;
function on<E extends keyof EventMap>(event: E, handler: Handler<E>) {
window.addEventListener(event, handler as EventListener);
}Когда не следует усложнять типы
Условные и отображаемые типы расширяют возможности, но также добавляют сложность. Используйте их, когда они устраняют реальное дублирование или предотвращают настоящие ошибки, а не просто ради демонстрации знаний TypeScript.
Быстрая проверка
Что делает отображаемый тип { [K in keyof T]?: T[K] }?
Итоги
Условные типы (T extends U ? X : Y) создают типы, ветвящиеся в зависимости от совместимости при присваивании. Отображаемые типы ([K in keyof T]) преобразуют каждое свойство типа. Используйте их для частичных типов форм обновления, типизированных карт событий, структур ошибок форм и путей API на основе шаблонных строк.
Часто задаваемые вопросы
Урок «Условные и отображаемые типы в React» бесплатный?
Да — полный текст урока «Условные и отображаемые типы в React» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Условные и отображаемые типы в React»?
Создавайте типы свойств компонентов, форма которых меняется в зависимости от значений других свойств, используя условные типы. Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Условные и отображаемые типы в React»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Размеченные объединения для вариантов компонентов
- Условные и отображаемые типы в React
- Полиморфные компоненты со свойством 'as'
- Типобезопасные формы и контракты ответов API