ユーティリティ型
TypeScript
Partial、Required、Pick、Omit など
Partial / Required / Readonly
プロパティの省略可能・必須・読み取り専用変換
interface User {
id: number;
name: string;
email: string;
age: number;
}
// Partial<T> — 全プロパティをオプショナルに
type UserPatch = Partial<User>;
// { id?: number; name?: string; email?: string; age?: number; }
// 使用例: 更新用の引数
function updateUser(id: number, patch: Partial<User>): User {
return { ...currentUser, ...patch };
}
// Required<T> — 全プロパティを必須に
type RequiredUser = Required<User>;
// Readonly<T> — 全プロパティを読み取り専用に
type FrozenUser = Readonly<User>;
const u: FrozenUser = { id: 1, name: 'Alice', email: '', age: 30 };
// u.name = 'Bob'; // ❌ エラー
// ReadonlyArray との組み合わせ
const users: Readonly<User[]> = [];
// users.push(newUser); // ❌ エラーPick / Omit / Record
プロパティの選択・除外・辞書型
interface User {
id: number; name: string; email: string; password: string; age: number;
}
// Pick<T, Keys> — 特定プロパティだけ取り出す
type UserPreview = Pick<User, 'id' | 'name'>;
// { id: number; name: string; }
// Omit<T, Keys> — 特定プロパティを除外
type PublicUser = Omit<User, 'password'>;
// { id: number; name: string; email: string; age: number; }
// Record<Keys, Type> — 辞書型(マップ)
type RoleMap = Record<string, User[]>;
const roles: RoleMap = { admin: [], user: [], guest: [] };
// ユニオン型をキーに
type Status = 'active' | 'inactive' | 'pending';
type StatusLabel = Record<Status, string>;
const labels: StatusLabel = {
active: '有効',
inactive: '無効',
pending: '保留中',
};
// Extract<T, U> / Exclude<T, U>
type OnlyStrings = Extract<string | number | boolean, string>; // string
type NoStrings = Exclude<string | number | boolean, string>; // number | booleanParameters / ReturnType / Awaited
関数型から引数・戻り値型を取り出す
function fetchUser(id: number, options?: RequestInit): Promise<User> {
return fetch(`/api/users/${id}`, options).then(r => r.json());
}
// Parameters<T> — 引数の型をタプルとして取得
type FetchArgs = Parameters<typeof fetchUser>;
// [id: number, options?: RequestInit]
// ReturnType<T> — 戻り値の型を取得
type FetchReturn = ReturnType<typeof fetchUser>;
// Promise<User>
// Awaited<T> — Promiseの解決型を取得
type ResolvedUser = Awaited<ReturnType<typeof fetchUser>>;
// User
// ConstructorParameters<T> — コンストラクタの引数型
class Timer { constructor(delay: number, label: string) {} }
type TimerArgs = ConstructorParameters<typeof Timer>; // [number, string]
// InstanceType<T> — クラスのインスタンス型
type TimerInstance = InstanceType<typeof Timer>; // Timer
// NonNullable<T> — null / undefined を除外
type SafeUser = NonNullable<User | null | undefined>; // User