導入
オブジェクトリテラルが「決められた形を満たしているか」はチェックしたいけれど、変数自体の型は具体的な値のまま(プロパティ名まで絞り込まれたまま)にしておきたい、ということがあります。型注釈(: 型)だとチェックはできますが、型が広がってしまいます。それを解決するのが satisfies 演算子です。
説明
まず、型注釈を使った場合を見てみましょう。
type Colors = Record<string, string>;
const palette: Colors = {
red: "#ff0000",
green: "#00ff00",
};
console.log(palette.red);
これは動きますが、palette の型は Record<string, string> という「キーが string の何か」まで広がってしまい、red や green という具体的なキーを持っている、という情報が失われます。
satisfies を使うと、Colors を満たしているかはチェックしつつ、palette の型はリテラルのまま({ red: string; green: string })保たれます。
type Colors = Record<string, string>;
const palette = {
red: "#ff0000",
green: "#00ff00",
} satisfies Colors;
console.log(palette.red); // red という具体的なプロパティのまま使える
「型のチェックはしたいが、値の詳しい形は保ちたい」というときに satisfies を選びます。TypeScript 4.9 以降で使える、比較的新しい記法です。
やってみよう
palette に blue: "#0000ff" を足して console.log(palette.blue) を試してみましょう。
演習
type Config = Record<string, number>; を使い、const settings = { timeout: 30, retry: 3 } satisfies Config; と書いてください。console.log(settings.retry) で結果を表示してください。
ヒント1を見る
type Config = Record<string, number>; const settings = { timeout: 30, retry: 3 } satisfies Config; と書きます。
ヒント2を見る
console.log(settings.retry); です。