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 wT
.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.