React Academy · Lektion

Villkorliga och mappade typer i React

Bygg komponentpropstyper vars form ändras utifrån andra prop-värden med conditional types.

Lektion 2 av 413 steg

Villkorliga och mappade typer i React är en gratis lektion i React Academy på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för React Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i React Academy innehåller totalt 4 lektioner.

Grunderna i villkorstyper

En villkorstyp använder syntaxen T extends U ? X : Y – om T kan tilldelas till U blir resultatet typen X, annars Y.

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

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

Villkorsstyrda props baserat på andra props

Använd villkorstyper för att göra en prop obligatorisk eller valfri baserat på värdet i en annan prop.

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

Mappade typer

Mappade typer skapar en ny typ genom att omforma varje property i en befintlig typ. Syntaxen in keyof itererar över alla nycklar.

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

Gör props valfria i uppdateringsformulär

Använd Partial<T> (en inbyggd mappad typ) för props i uppdateringsformulär där inte alla fält är obligatoriska.

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 med mappade typer

Skapa uppslagstyper där nycklarna kommer från en union och värdena har en enhetlig form.

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

Välj obligatoriska nycklar

Använd villkorstyper med -? (ta bort optional) för att extrahera endast de obligatoriska nycklarna i en typ.

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'

Template literal-typer

Template literal-typer kombinerar strängliteraltyper och möjliggör typade händelsenamn, CSS-klasssträngar och API-sökvägar.

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'

Extrahera props villkorligt

Använd Extract och Exclude för att filtrera unionstyper.

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

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

Mappade typer för formulärvalidering

Generera typer för valideringsfel som speglar formen på dina formulärdata – en sträng med ett felmeddelande per fält.

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

Diskriminerade mappade typer

Kombinera mappade typer med villkorstyper för att skapa typer som ändrar form baserat på en diskriminant.

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

När typer inte ska överkonstrueras

Villkors- och mappade typer ger större uttryckskraft men också mer komplexitet. Använd dem när de eliminerar verklig duplicering eller förhindrar faktiska buggar – inte bara för att visa kunskaper i TypeScript.

Snabbkontroll

Vad gör den mappade typen { [K in keyof T]?: T[K] }?

Sammanfattning

Villkorstyper (T extends U ? X : Y) skapar typer som förgrenas baserat på tilldelningsbarhet. Mappade typer ([K in keyof T]) omformar varje property i en typ. Använd dem för partiella typer i uppdateringsformulär, typade händelsekartor, former för formulärfel och API-sökvägar med template literals.

Gratis att börja

Lär dig React med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
88
Lektioner
324

Vanliga frågor

Är lektionen ”Villkorliga och mappade typer i React” gratis?

Ja – hela texten till ”Villkorliga och mappade typer i React” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i React Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i React Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Villkorliga och mappade typer i React”?

Bygg komponentpropstyper vars form ändras utifrån andra prop-värden med conditional types. Ni övar på React Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig React Academy?

Du behöver inga förkunskaper. Utbildningen i React Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Villkorliga och mappade typer i React”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här React Academy-lektionen?

Ja. Varje React Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Discriminated unions för komponentvarianter
  2. Villkorliga och mappade typer i React
  3. Polymorfa komponenter med propen 'as'
  4. Typsäkra formulär och kontrakt för API-svar
← Tillbaka till React Academy