#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を拝見させて頂いて、多くの気づきを得ています。
本当に感謝🙏です。
今後ともよろしくお願いします。
