Введение в сопоставленные типы TypeScript

Отображенные типы в TypeScript предоставляют способ создания новых типов путем преобразования существующих. Они являются мощным инструментом для обработки сложных операций с типами и обеспечения безопасности типов в приложениях TypeScript. В этой статье представлены отображенные типы, объясняется их синтаксис и приводятся примеры для демонстрации их использования.

Что такое сопоставленные типы?

Отображенные типы позволяют создавать новые типы, применяя преобразование к каждому свойству существующего типа. Они часто используются для гибкого изменения или расширения типов. Базовый синтаксис отображенного типа:

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

В этом синтаксисе:

  • T — оригинальный тип.
  • K представляет каждую клавишу в T.
  • NewType — это новый тип, назначенный каждому свойству.

Базовый пример сопоставленных типов

Вот простой пример сопоставленного типа, который преобразует все свойства заданного типа в доступные только для чтения:

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

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

type ReadOnlyUser = ReadOnly;

В этом примере сопоставленный тип ReadOnly преобразует все свойства типа User в доступные только для чтения, в результате чего получается новый тип ReadOnlyUser, все свойства которого являются неизменяемыми.

Отображенные типы с преобразованиями типов

Отображенные типы также могут использоваться для преобразования типов более сложными способами. Например, отображенный тип, который делает все свойства необязательными:

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

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

type PartialUser = Partial;

В этом примере сопоставленный тип Partial делает все свойства типа User необязательными, что приводит к новому типу PartialUser, где каждое свойство является необязательным.

Использование сопоставленных типов с условными типами

Отображенные типы можно комбинировать с условными типами для более сложных операций с типами. Например, создание типа, который включает только свойства определенного типа:

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

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

type StringProperties = OnlyStrings;

В этом примере сопоставленный тип OnlyStrings отфильтровывает свойства, которые не относятся к типу string, в результате чего получается новый тип StringProperties, который включает только строковые свойства из типа User.

Расширенные типы сопоставления

Расширенные варианты использования сопоставленных типов включают создание типов, которые изменяют существующие типы на основе различных условий. Например, сопоставленный тип, который добавляет суффикс к каждому имени свойства:

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

В этом примере сопоставленный тип WithSuffix добавляет суффикс к каждому имени свойства типа User, в результате чего получается новый тип UserWithSuffix, в котором имена свойств имеют указанный суффикс.

Заключение

Отображенные типы в TypeScript — это универсальная функция, которая позволяет разработчикам создавать новые типы путем преобразования существующих. Понимая и используя отображенные типы, разработчики могут управлять сложными преобразованиями типов и обеспечивать большую безопасность типов в своем коде TypeScript. Отображенные типы предлагают мощные возможности для улучшения и настройки определений типов в приложениях TypeScript.