TypeScript: 型注釈や as の代わりに satisfies を使い、推論を保ったまま型チェックする
satisfies T は「T に合っているか」を検査しつつ、値の型は書いたとおりの具体的な型(リテラル型など)のまま残す。
どんな問題を解決する?
: Tで型注釈すると、値の型がTに広がってしまい、config.portがstring | numberになる等、具体的な情報が失われるas Tはコンパイラに「信じて」と言うだけでチェックが甘く、ミスを見逃す
コード例
ts
type Config = Record<string, string | number>;
// 型注釈: port は string | number に広がる
const a: Config = { port: 3000, host: "localhost" };
a.port.toFixed(); // ❌ エラー(string かもしれない)
// satisfies: Config に合うか検査しつつ、port は number のまま
const b = { port: 3000, host: "localhost" } satisfies Config;
b.port.toFixed(); // ✅ OK
// as: 間違っていても通ってしまうことがある
const c = {} as { port: number }; // ⚠️ port が無いのにエラーにならない
c.port.toFixed(); // 実行時に TypeError- 判別可能なユニオンやリテラル型の補完がそのまま効くのも利点。
使い分けの目安
- 定数オブジェクト・設定・ルーティング表などは
satisfies asは「コンパイラより自分が知っている」場面(例: 外部APIのJSON.parse結果)に限定。その場合も、Zod などで実行時検証するほうが安全
注意点
- TypeScript 4.9 以降。
satisfiesは値の型を変えないので、関数の戻り値型などで広い型として扱いたい場合は型注釈を使う。