TypeScript の `satisfies` 演算子 解説
as const
の柔軟性を保ちつつ、ある型に適合しているかどうかを型レベルでチェックしたい場合に使えるのが satisfies
演算子です。
TypeScript 4.9 以降で使用可能です。
🎯 satisfies
とは?
satisfies
は「指定した型に適合しているかをコンパイル時に検査するための演算子」です。
一方で、リテラル型などの詳細な型情報は保持されます。
📦 基本構文
const obj = {
foo: "bar",
count: 42,
} satisfies { foo: string; count: number };
- ✅ 型が一致しなければコンパイルエラー
- ✅ 詳細なリテラル型(”bar”, 42 など)は保持される
🔍 as
との違い
比較項目 | as |
satisfies |
---|---|---|
型の強制変換 | ✅ できる | ❌ できない |
型チェック | ❌ しない | ✅ する(型に合っているか確認) |
リテラル型保持 | ❌ 潰れる | ✅ 維持される |
キャスト用途 | ◎ | ❌ |
📌 イメージ比較
const val = {
foo: "hello",
} as { foo: string }; // foo: string
const val2 = {
foo: "hello",
} satisfies { foo: string }; // foo: "hello"
🧠 使用例:定数列挙(enumの代替)
type StatusItem = {
code: string;
name: string;
};
const Status = {
Get: { code: "0", name: "検索" },
Put: { code: "1", name: "登録" },
Post: { code: "2", name: "更新" },
} satisfies Record<string, StatusItem>;
✅ 効果
Status["Get"].code
は"0"
型(リテラル型)で保持Status
の各値がStatusItem
に適合しているか型検査されるname: 123
などの不正定義はエラーになる
🛠️ 応用パターン
リテラル型の一覧抽出:
type StatusCode = (typeof Status)[keyof typeof Status]["code"];
// → "0" | "1" | "2"
コード一覧取得:
const codeList: StatusCode[] = Object.values(Status).map(s => s.code);
🛑 注意点
satisfies
は 型変換ではなく、型検査 です(as
の代替ではない)- TypeScript 4.9以降が必要
- 推論される型を変えることはできない
✅ まとめ
特徴 | 説明 |
---|---|
型の適合をチェック | ✅ 指定した型と一致しているか検査できる |
型の詳細を維持 | ✅ リテラル型などの情報を保持 |
enumの代替構造と相性良し | ✅ 定数オブジェクトと Record の検証に最適 |
安全で柔軟な型推論 | ✅ 型定義と実体を乖離させずにチェックできる |
✅ おすすめユースケース
- マスタデータの定義と型安全チェック
- 定数オブジェクト(enum代替)との併用
- ラベル付き構造(
{ code, name }
など)の検証 - チーム開発での 「型と値のズレ防止」
const Master = {
Admin: { code: "A", label: "管理者" },
User: { code: "U", label: "一般ユーザー" },
} satisfies Record<string, { code: string; label: string }>;