TypeScript

ユーティリティ型

TypeScript

Partial、Required、Pick、Omit など

Partial / Required / Readonly

プロパティの省略可能・必須・読み取り専用変換

utility1.ts typescript
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

プロパティの選択・除外・辞書型

utility2.ts typescript
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 | boolean

Parameters / ReturnType / Awaited

関数型から引数・戻り値型を取り出す

utility3.ts typescript
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