見出し画像

#033 TypeScript(17):TypeScriptのユーティリティ型

ユーティリティ型

TypeScriptには、既存の型を基に新しい型を作成するための便利なユーティリティ型がいくつか用意されています。
これらのユーティリティ型を使うことで、型の定義を簡潔にし、再利用性を高めることができます。
以下に、主要なユーティリティ型を簡潔に説明します。

1. Partial<T>

  • 説明: 型 T のすべてのプロパティをオプションにします。

  • 使用例

interface User {
  name: string;
  age: number;
  email: string;
}

const updateUser: Partial<User> = {
  name: "Alice"
};

updateUser には User の一部のプロパティのみを含めることができます。

2. Required<T>

  • 説明: 型 T のすべてのプロパティを必須にします。

  • 使用例

interface User {
  name?: string;
  age?: number;
  email?: string;
}

const user: Required<User> = {
  name: "Alice",
  age: 30,
  email: "alice@example.com"
};

user には User のすべてのプロパティを必須で含める必要があります。

3. Readonly<T>

  • 説明: 型 T のすべてのプロパティを読み取り専用にします。

  • 使用例

interface User {
  name: string;
  age: number;
  email: string;
}

const user: Readonly<User> = {
  name: "Alice",
  age: 30,
  email: "alice@example.com"
};

// user.name = "Bob"; // エラー: 読み取り専用プロパティには代入できません

4. Pick<T, K>

  • 説明: 型 T から特定のプロパティ K のみを抽出します。

  • 使用例

interface User {
  name: string;
  age: number;
  email: string;
}

const user: Pick<User, "name" | "email"> = {
  name: "Alice",
  email: "alice@example.com"
};

5. Omit<T, K>

  • 説明: 型 T から特定のプロパティ K を除外します。

  • 使用例

interface User {
  name: string;
  age: number;
  email: string;
}

const user: Omit<User, "age"> = {
  name: "Alice",
  email: "alice@example.com"
};

6. Record<K, T>

  • 説明: プロパティ名が K 型で、プロパティ値が T 型であるオブジェクトを作成します。

  • 使用例

type Role = "admin" | "user" | "guest";

const roles: Record<Role, string> = {
  admin: "Admin User",
  user: "Regular User",
  guest: "Guest User"
};

7. Exclude<T, U>

  • 説明: 型 T から型 U を除外します。

  • 使用例

type AllTypes = string | number | boolean;
type StringOrNumber = Exclude<AllTypes, boolean>; // string | number

8. Extract<T, U>

  • 説明: 型 T から型 U を抽出します。

  • 使用例

type AllTypes = string | number | boolean;
type OnlyStringOrNumber = Extract<AllTypes, string | number>; // string | number

まとめ

これらのユーティリティ型を使うことで、型定義を効率化し、コードの再利用性を高めることができます。TypeScriptのユーティリティ型は、複雑な型操作を簡単にし、コードの可読性と保守性を向上させるための強力なツールです。

ソースコード

// Partial<T>: 型 T のすべてのプロパティをオプションにします。
interface User {
  name: string;
  age: number;
  email: string;
}

const partialUser: Partial<User> = { name: "Alice" };
console.log("Partial<User>:", partialUser); // 出力: { name: "Alice" }

// Required<T>: 型 T のすべてのプロパティを必須にします。
interface OptionalUser {
  name?: string;
  age?: number;
  email?: string;
}

const requiredUser: Required<OptionalUser> = { name: "Bob", age: 25, email: "bob@example.com" };
console.log("Required<OptionalUser>:", requiredUser); // 出力: { name: "Bob", age: 25, email: "bob@example.com" }

// Readonly<T>: 型 T のすべてのプロパティを読み取り専用にします。
const readonlyUser: Readonly<User> = { name: "Carol", age: 28, email: "carol@example.com" };
// readonlyUser.name = "Dave"; // エラー: 読み取り専用プロパティには代入できません
console.log("Readonly<User>:", readonlyUser); // 出力: { name: "Carol", age: 28, email: "carol@example.com" }

// Pick<T, K>: 型 T から特定のプロパティ K のみを抽出します。
const pickedUser: Pick<User, "name" | "email"> = { name: "Eve", email: "eve@example.com" };
console.log("Pick<User, 'name' | 'email'>:", pickedUser); // 出力: { name: "Eve", email: "eve@example.com" }

// Omit<T, K>: 型 T から特定のプロパティ K を除外します。
const omittedUser: Omit<User, "age"> = { name: "Frank", email: "frank@example.com" };
console.log("Omit<User, 'age'>:", omittedUser); // 出力: { name: "Frank", email: "frank@example.com" }

// Record<K, T>: プロパティ名が K 型で、プロパティ値が T 型であるオブジェクトを作成します。
type Role = "admin" | "user" | "guest";
const roles: Record<Role, string> = { admin: "Admin User", user: "Regular User", guest: "Guest User" };
console.log("Record<Role, string>:", roles); // 出力: { admin: "Admin User", user: "Regular User", guest: "Guest User" }

// Exclude<T, U>: 型 T から型 U を除外します。
type AllTypes = string | number | boolean;
type StringOrNumber = Exclude<AllTypes, boolean>; // string | number
const excludeExample: StringOrNumber = "Hello";
console.log("Exclude<string | number | boolean, boolean>:", excludeExample); // 出力: Hello

// Extract<T, U>: 型 T から型 U を抽出します。
type OnlyStringOrNumber = Extract<AllTypes, string | number>; // string | number
const extractExample: OnlyStringOrNumber = 42;
console.log("Extract<string | number | boolean, string | number>:", extractExample); // 出力: 42

終わりに

少し長くなったので、ここで一旦お話をクローズさせて頂きます。
自分自身の学習記録帳のため、乱雑な文章になっている可能性があります。
申し訳ございません。

最後までお読みいただき、ありがとうございます。
私も皆さんのnoteを拝見させて頂いて、多くの気づきを得ています。
本当に感謝🙏です。
今後ともよろしくお願いします。

いいなと思ったら応援しよう!