Wprowadzenie do mapowanych typów TypeScript

Typy mapowane w TypeScript umożliwiają tworzenie nowych typów poprzez transformację istniejących. Są potężnym narzędziem do obsługi złożonych operacji na typach i zapewniania bezpieczeństwa typów w aplikacjach TypeScript. W tym artykule przedstawiono typy mapowane, wyjaśniono ich składnię i podano przykłady demonstrujące ich użycie.

Czym są typy mapowane?

Typy mapowane umożliwiają tworzenie nowych typów poprzez zastosowanie transformacji do każdej właściwości istniejącego typu. Są one często używane do modyfikowania lub rozszerzania typów w elastyczny sposób. Podstawowa składnia typu mapowanego jest następująca:

type MappedType = {
  [K in keyof T]: NewType;
};

W tej składni:

  • T jest oryginalnym typem.
  • K reprezentuje każdy klawisz w T.
  • NewType to nowy typ przypisany do każdej właściwości.

Podstawowy przykład typów mapowanych

Oto prosty przykład typu mapowanego, który konwertuje wszystkie właściwości danego typu na właściwości tylko do odczytu:

type ReadOnly = {
  readonly [K in keyof T]: T[K];
};

type User = {
  name: string;
  age: number;
};

type ReadOnlyUser = ReadOnly;

W tym przykładzie typ mapowany ReadOnly przekształca wszystkie właściwości typu User tak, aby były tylko do odczytu, co skutkuje powstaniem nowego typu ReadOnlyUser, w którym wszystkie właściwości są niezmienne.

Typy mapowane z transformacjami typów

Typy mapowane mogą być również używane do transformacji typów w bardziej złożony sposób. Na przykład typ mapowany, który sprawia, że ​​wszystkie właściwości są opcjonalne:

type Partial = {
  [K in keyof T]?: T[K];
};

type User = {
  name: string;
  age: number;
};

type PartialUser = Partial;

W tym przykładzie typ mapowany Partial sprawia, że ​​wszystkie właściwości typu User stają się opcjonalne, co skutkuje powstaniem nowego typu PartialUser, w którym każda właściwość jest opcjonalna.

Używanie typów mapowanych z typami warunkowymi

Typy mapowane można łączyć z typami warunkowymi w celu uzyskania bardziej złożonych operacji na typach. Na przykład utworzenie typu, który obejmuje tylko właściwości określonego typu:

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

type User = {
  name: string;
  age: number;
  email: string;
};

type StringProperties = OnlyStrings;

W tym przykładzie typ mapowany OnlyStrings filtruje właściwości, które nie są typu string, co skutkuje powstaniem nowego typu StringProperties zawierającego tylko właściwości typu string z typu User.

Zaawansowane typy mapowane

Zaawansowane przypadki użycia typów mapowanych obejmują tworzenie typów, które modyfikują istniejące typy na podstawie różnych warunków. Na przykład typ mapowany, który dodaje sufiks do każdej nazwy właściwości:

type WithSuffix<T, S extends string> = {
  [K in keyof T as `${string & K}${S}`]: T[K];
};

type User = {
  name: string;
  age: number;
};

type UserWithSuffix = WithSuffix<User, "Prop">;

W tym przykładzie typ mapowany WithSuffix dodaje sufiks do każdej nazwy właściwości typu User, co skutkuje powstaniem nowego typu UserWithSuffix, w którym nazwy właściwości mają określony sufiks.

Wniosek

Mapowane typy w TypeScript to wszechstronna funkcja, która umożliwia programistom tworzenie nowych typów poprzez transformację istniejących. Dzięki zrozumieniu i wykorzystaniu mapowanych typów programiści mogą zarządzać złożonymi transformacjami typów i zapewnić większe bezpieczeństwo typów w swoim kodzie TypeScript. Mapowane typy oferują potężne możliwości ulepszania i dostosowywania definicji typów w aplikacjach TypeScript.