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'>; // truePropsy 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
- Rozłączne sumy dla wariantów komponentów
- Typy warunkowe i mapowane w React
- Komponenty polimorficzne z propsem 'as'
- Formularze bezpieczne typowo i kontrakty odpowiedzi API