0Pricing
React Academy · Урок

Условные и отображаемые типы в 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 — локальная установка не требуется.

Все уроки этого курса

  1. Размеченные объединения для вариантов компонентов
  2. Условные и отображаемые типы в React
  3. Полиморфные компоненты со свойством 'as'
  4. Типобезопасные формы и контракты ответов API
← Назад к React Academy