0Pricing
React Academy · Lekcja

Typy warunkowe i mapowane w React

Budowanie typów propsów komponentów, których kształt zmienia się na podstawie wartości innych propsów, za pomocą typów warunkowych.

Typy warunkowe i mapowane w React to bezpłatna lekcja React Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej React Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs React Academy zawiera 4 lekcji w sumie.

Podstawy typów warunkowych

Typ warunkowy używa składni T extends U ? X : Y — jeśli T można przypisać do U, typ przyjmuje wartość X, w przeciwnym razie Y.

type IsString<T> = T extends string ? true : false;

type A = IsString<string>;  // true
type B = IsString<number>;  // false
type C = IsString<'hello'>; // true

Propsy warunkowe zależne od innych propsów

Użyj typów warunkowych, aby uczynić prop wymaganym lub opcjonalnym w zależności od wartości innego propsa.

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 };

Typy mapowane

Typy mapowane tworzą nowy typ, przekształcając każdą właściwość istniejącego typu. Składnia in keyof iteruje po wszystkich kluczach.

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 };

Opcjonalne propsy w formularzach aktualizacji

Użyj Partial<T> (wbudowanego typu mapowanego) dla propsów formularza aktualizacji, w którym nie wszystkie pola są wymagane.

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 z typami mapowanymi

Twórz typy mapowań, w których klucze pochodzą z unii, a wartości mają spójny kształt.

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' },
};

Wybieranie wymaganych kluczy

Użyj typów warunkowych z -? (usuwającym opcjonalność), aby wyodrębnić tylko wymagane klucze typu.

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'

Typy literałów szablonowych

Typy literałów szablonowych łączą typy literałów łańcuchów znaków, umożliwiając tworzenie typowanych nazw zdarzeń, łańcuchów klas CSS i ścieżek 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'

Warunkowe wyodrębnianie propsów

Użyj Extract i Exclude, aby filtrować unie typów.

type AllProps = 'onClick' | 'onHover' | 'onChange' | 'style';
type EventHandlers = Extract<AllProps, `on${string}`>;
// 'onClick' | 'onHover' | 'onChange'

type NonEventProps = Exclude<AllProps, `on${string}`>;
// 'style'

Typy mapowane do walidacji formularzy

Generuj typy błędów walidacji odzwierciedlające kształt danych formularza — po jednym komunikacie tekstowym błędu dla każdego pola.

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' };

Rozłączne typy mapowane

Połącz typy mapowane z warunkowymi, aby tworzyć typy, które zmieniają kształt w zależności od dyskryminanta.

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);
}

Kiedy nie projektować typów na wyrost

Typy warunkowe i mapowane zwiększają możliwości, ale także złożoność. Należy ich używać, gdy eliminują rzeczywiste powielenie lub zapobiegają konkretnym błędom — nie tylko po to, by demonstrować znajomość TypeScriptu.

Szybki sprawdzian

Co robi typ mapowany { [K in keyof T]?: T[K] }?

Podsumowanie

Typy warunkowe (T extends U ? X : Y) tworzą typy rozgałęziające się na podstawie możliwości przypisania. Typy mapowane ([K in keyof T]) przekształcają każdą właściwość typu. Używaj ich do tworzenia częściowych typów formularzy aktualizacji, typowanych map zdarzeń, struktur błędów formularzy i ścieżek API opartych na literałach szablonowych.

Często zadawane pytania

Czy lekcja „Typy warunkowe i mapowane w React” jest bezpłatna?

Tak — pełny tekst „Typy warunkowe i mapowane w React” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu React Academy, przejdź na CoddyKit PRO. Kurs React Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Typy warunkowe i mapowane w React”?

Budowanie typów propsów komponentów, których kształt zmienia się na podstawie wartości innych propsów, za pomocą typów warunkowych. Ćwiczysz React Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć React Academy?

Nie wymagamy żadnego doświadczenia. React Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Typy warunkowe i mapowane w React”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji React Academy?

Tak. Każda lekcja React Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Rozłączne sumy dla wariantów komponentów
  2. Typy warunkowe i mapowane w React
  3. Komponenty polimorficzne z propsem 'as'
  4. Formularze bezpieczne typowo i kontrakty odpowiedzi API
← Powrót do React Academy