TypeScript betingede typer

Betingede typer i TypeScript giver en måde at oprette typer, der afhænger af en betingelse. De giver mulighed for større fleksibilitet og udtryksfuldhed i typedefinitioner, hvilket gør det muligt at modellere komplekse typeforhold på en klar og kortfattet måde. Denne artikel undersøger, hvordan betingede typer fungerer i TypeScript og giver eksempler til at illustrere deres brug.

Hvad er betingede typer?

Betingede typer gør det muligt at oprette typer, der vælges baseret på en betingelse. De ligner betingede udsagn i programmering, men fungerer på typeniveau. Den grundlæggende syntaks for en betinget type er:

type ConditionalType = T extends U ? X : Y;

I denne syntaks:

  • T er den type, der kontrolleres.
  • U er typen, man skal sammenligne med.
  • X er den type, der returneres, hvis T forlænger U.
  • Y er den type, der returneres, hvis T ikke forlænger U.

Grundlæggende eksempel på betingede typer

Her er et simpelt eksempel på en betinget type, der returnerer forskellige typer baseret på, om en given type er en streng eller ej:

type IsString = T extends string ? "String" : "Not a string";

type Result1 = IsString;  // Result1 is "String"
type Result2 = IsString;  // Result2 is "Not a string"

I dette eksempel kontrollerer IsString, om T forlænger streng. Hvis den gør det, er resultatet "String"; ellers er det "Not a string".

Brug af betingede typer med generiske typer

Betingede typer kan også bruges med generiske typer for at skabe mere fleksible og genbrugelige typedefinitioner. For eksempel en type, der udtrækker returtypen af ​​en funktion:

type ReturnType = T extends (...args: any[]) => infer R ? R : never;

type FunctionType = (x: number) => string;

type Result = ReturnType;  // Result is string

I dette eksempel bruger ReturnType nøgleordet infer til at udlede returtypen R af funktionstypen T. Hvis T er en funktionstype, vil ReturnType være returtypen; ellers er den standard til aldrig.

Betingede typer med foreningstyper

Betingede typer kan også arbejde med fagforeningstyper for at håndtere flere mulige typer. For eksempel at skelne mellem forskellige fagforeningsmedlemmer:

type ExtractString = T extends string ? T : never;

type UnionType = string | number | boolean;

type Result = ExtractString;  // Result is string

I dette eksempel udtrækker ExtractStringstring fra en unionstype UnionType, hvilket resulterer i string.

Betingede typer med typetilknytninger

Betingede typer kan kombineres med typetilknytninger for at skabe mere komplekse typetransformationer. For eksempel, kortlægning over en række typer for at anvende en betinget type:

type MapArray = {
  [K in keyof T]: T[K] extends string ? T[K] : never;
};

type ArrayType = [string, number, boolean];

type MappedArray = MapArray;  // MappedArray is [string, never, never]

I dette eksempel kortlægger MapArray hvert element i arrayet T og anvender en betinget type til hvert element, hvilket resulterer i et array, hvor kun strengelementer er bevaret.

Konklusion

Betingede typer i TypeScript er et kraftfuldt værktøj til at skabe fleksible og udtryksfulde typedefinitioner. Ved at udnytte betingede typer kan udviklere modellere komplekse typeforhold, håndtere forskellige scenarier og forbedre typesikkerheden i deres TypeScript-kode. At forstå, hvordan man bruger betingede typer effektivt, kan forbedre evnen til at skrive robust og vedligeholdelig TypeScript-kode markant.