TypeScript マップ型の紹介

TypeScript のマップ型は、既存の型を変換して新しい型を作成する方法を提供します。マップ型は、複雑な型操作を処理し、TypeScript アプリケーションで型の安全性を確保するための強力なツールです。この記事では、マップ型を紹介し、その構文を説明し、その使用例を示します。

マップされたタイプとは何ですか?

マップ型を使用すると、既存の型の各プロパティに変換を適用して新しい型を作成できます。マップ型は、型を柔軟に変更または拡張するためによく使用されます。マップ型の基本的な構文は次のとおりです。

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

この構文では、

  • Tはオリジナルタイプです。
  • KTの各キーを表します。
  • 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 型ではないプロパティを除外し、User 型の文字列プロパティのみを含む新しい型 StringProperties を生成します。

高度なマップ型

マップされた型の高度な使用例としては、さまざまな条件に基づいて既存の型を変更する型の作成などがあります。たとえば、各プロパティ名にサフィックスを追加するマップされた型は次のようになります。

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 アプリケーションで型定義を強化およびカスタマイズするための強力な機能を提供します。