TypeScriptはJavaScriptに静的型付けの機能が追加された言語で初学者でも手軽に利用できます。
この記事では、TypeScriptの使いこなすと効率がアップするユーティリティ型を8つ取り上げ、使い方やユースケースを紹介します。
また、コードも一緒に見ていくことでより理解が深まります。
ユーティリティ型は特定の目的に使われる型で、TypeScriptの型定義を手助けしてくれます。
そんな便利なユーティリティ型には、Partial
、Readonly
、Pick
、Required
、Record
、Omit
、Exclude
、Extract
の8つが存在し、特徴と使い所を解説します。
Partial型は、オブジェクトのプロパティをオプションに変換します。これにより、オブジェクト型のプロパティが任意となります。
オブジェクトの一部を更新する関数の引数や、オプショナルなプロパティを持つオブジェクトを扱う場合に便利です。
interface Profile {
name: string;
age: number;
}
function updateProfile(profile: Profile, updates: Partial<Profile>): Profile {
return { ...profile, ...updates };
}
const profile: Profile = {
name: "Alice",
age: 30,
};
const updatedProfile = updateProfile(profile, { age: 31 });
Readonly型は、オブジェクトのプロパティを読み取り専用に変換します。これにより、オブジェクトのプロパティが変更できなくなります。
変更されては困るデータを扱う際や、関数の引数で変更を禁止したい場合に使用されます。
interface Point {
x: number;
y: number;
}
const p1: Readonly<Point> = { x: 10, y: 20 };
p1.x = 30; // Error: 'x' is a read-only property
Pick型は、オブジェクトから指定したプロパティだけを抜き出すことができます。これにより、必要なプロパティだけのオブジェクト型を簡単に作成できます。
特定のプロパティを持つ部分オブジェクトを作成したり、特定のプロパティのみを扱う関数の引数として使用する場合に便利です。
interface Profile {
name: string;
age: number;
address: string;
}
type ProfileNameAndAge = Pick<Profile, "name" | "age">;
const profile: ProfileNameAndAge = {
name: "Alice",
age: 30,
};
Required型は、オブジェクトのすべてのプロパティを必須に変換します。これにより、オプショナルなプロパティがあっても、全て必須となります。
必須のプロパティを持つオブジェクトを扱う場合や、APIから返ってくるオブジェクトで欠けているデータがある場合に便利です。
interface Profile {
name: string;
age: number;
address?: string;
}
type RequiredProfile = Required<Profile>;
const profile: RequiredProfile = {
name: "Alice",
age: 30,
address: "123 Main St", // このプロパティは必須になります
};
Record型は、指定したキーに対して同じ型の値を持つオブジェクトを作成します。これにより、特定のキーの集合に対して値を割り当てたり、オブジェクトのキーを動的に扱うことができます。
キーと値のペアを持つオブジェクトを扱う場合や、辞書型のデータ構造を表現する際に便利です。
type AnimalType = "cat" | "dog" | "bird";
type AnimalInfo = { name: string; age: number };
const animalMap: Record<AnimalType, AnimalInfo> = {
cat: { name: "Fluffy", age: 5 },
dog: { name: "Rex", age: 7 },
bird: { name: "Tweety", age: 2 },
};
Omit型は、オブジェクトから指定したプロパティを取り除くことができます。これにより、特定のプロパティを削除したオブジェクト型を簡単に作成できます。
特定のプロパティを除外したい場合や、一部のプロパティを非公開にしたい場合に活用できます。
interface Profile {
name: string;
age: number;
address: string;
}
type ProfileWithoutAddress = Omit<Profile, "address">;
const profile: ProfileWithoutAddress = {
name: "Alice",
age: 30,
};
Exclude型は、型 T から型 U に含まれる型を取り除くことができます。これにより、特定の型を除外する必要がある場合に、簡単に新しい型を作成できます。
型の集合から特定の型を排除したい場合や、条件に適合しない型を除外する際に便利です。
type AvailableColors = "red" | "green" | "blue" | "yellow";
type UsedColors = "red" | "blue";
type RemainingColors = Exclude<AvailableColors, UsedColors>; // "green" | "yellow"
Extract型は、型 T と型 U の両方に含まれる型を抽出することができます。これにより共通する型を取得することが容易になります。
型の集合から共通する型を抽出したい場合や、複数の条件に適合する型を取得する際に便利です。
type AvailableColors = "red" | "green" | "blue" | "yellow";
type SelectedColors = "red" | "blue" | "purple";
type ValidSelectedColors = Extract<AvailableColors, SelectedColors>; // "red" | "blue"
ユーティリティ型はTypeScriptを実務で使う上では欠かせない便利な機能です。Partial
、Readonly
、Pick
、Required
、Record
、Omit
、Exclude
、Extract
の8つのユーティリティ型を使いこなすことでコードが読みやすくなり、安全性もアップします。
これらの型を理解してTypeScriptをもっと効果的に使いましょう!
TypeScriptの短絡評価の使い方「&&」「||」「??」の解説
TypeScriptのタイマー関数setTimeoutとsetIntervalの使い方
TypeScriptの多次元配列の使い方についてわかりやすく解説
TypeScriptでのタプルの使い方と実践テクニックを解説
TypeScriptのimport typeをわかりやすく解説
TypeScriptの配列やオブジェクトのソート完全ガイド
TypeScriptコメントアウトの使い方 完全ガイド
TypeScriptのオブジェクトとプロパティの存在チェック完全ガイド
TypeScriptで即時関数を使う方法を解説!基本から実践的な使い方まで