Omit<T, K>
最終更新:2026-10-22
Omit<T, K> Omit
Omit<T, K> は T から K で指定したプロパティを「取り除き」、残りで新しい型を作ります。典型場面は機密情報の除去(passwordHash を外す)や、データベースの行を外部向けレスポンスに変えることです。Pick とは方向が正反対で、除きたいフィールドが少ないなら Omit の方が楽です。
| グループ | ユーティリティ型 |
|---|---|
| 種類 | 型 |
| strict モード | 不要 |
ℹ️ 説明 エディタは TypeScript を JavaScript にトランスパイルして実行します(型チェックなし)。型チェック結果は各サンプルの出力を参照してください。
📝 構文
type Omit<T, K extends string | number | symbol> =
Pick<T, Exclude<keyof T, K>>;
// 使い方
type PublicAccount = Omit<Account, "passwordHash" | "twoFA">;
⚙️ パラメータ
| T | 元となるオブジェクト型です。プロパティはここから取り除きます |
|---|---|
| K | 取り除くキーのユニオンです。なお K は T のキーであることを要求されず、書き間違えたキー名は静かに無視されます |
戻り値:新しい型です。T の K 以外の全プロパティを含み、型はそのまま一致します。
▶ サンプル
下のコードを編集して「試す」を押すと、トランスパイル実行結果を確認できます:
出力:
{"username":"carol","email":"carol@example.com"}
(トランスパイル後の実行出力。実装ではデストラクチャの rest で機密フィールドを取り除き、型の上でも PublicAccount には passwordHash が含まれません。スペルミスで Omit<Account, "passwordHash2"> と書くと、機密フィールドは取り除かれません)
💡 ポイント
ℹ️ 説明 実装は組み合わせの技です。Omit<T, K> = Pick<T, Exclude<keyof T, K>> と書き、まず Exclude でキーのユニオンから K を除き、次に Pick で残りを取ります。
⚠️ 注意 K は T のキーかどうか検証されません。Omit<Account, "passwordHashh">(1文字多く打っても)はエラーにならず、機密フィールドはそのまま残ります。安全に関わる脱敏には厳格版を使いましょう。type StrictOmit<T, K extends keyof T> = Omit<T, K> のように。
💡 ヒント Omit はブラックリストです。後に Account に追加したフィールドは自動的に Omit の結果に現れます。まさに「全部を外に出し、少数を隠す」場面に向いている理由です。
🏷️ 関連ユーティリティ型
💡 関連ケース
ケースは今後追加予定です。
📚 関連チュートリアル
❓ よくある質問
Q Omit と Pick は結局どちらを選ぶべきですか?
A 意図で決めます。「このいくつかだけが要る」なら Pick(ホワイトリスト。フィールドが少ないとき明確)、「このいくつかを除きたい」なら Omit(ブラックリスト。後から元の型にフィールドを加えても手直しが不要)。安全性が求められる脱敏では Pick の方が確実です(キー名の書き間違いがエラーになるため)。
Q Omit が Pick のようにキー名を検証しないのはなぜですか?
A 公式実装の K extends string | number | symbol という制約は、形が完全には分からない型からの除去にも対応できるよう意図的に緩められています。この緩さは両刃の剣です。柔軟である一方、キー名を書き間違えても静かに無効になります。厳格にしたいなら1行で自作の StrictOmit で戻せます。
Q 実行時に本当にプロパティを取り除くには?
A Omit は型しか変えません。実行時にはデストラクチャの rest が定番です。const { passwordHash, ...rest } = account; と書くか、delete account.passwordHash(厳格モードでは必須プロパティに対してコンパイルエラー)を使います。デストラクチャの rest が最も推奨されるやり方です。