型注釈(: Type)はプロパティを消さずに「見えなく」する。satisfiesとの違い
変数に: Typeという型注釈を付けると、その型に無いプロパティへのアクセスができなくなります。実行時にはプロパティ自体は残っていますが、型の上では「そんなものは無い」ものとして扱われます。satisfiesは元の値の型をそのまま保つため、この制限を受けません。
エラーメッセージの読み方
main.ts(4,20): error TS2339: Property 'z' does not exist on type 'Point'.
main.ts- ファイル名
4- 行番号
20- 列番号 — この位置でtscが検査に失敗しました
TS2339- エラーコード — 検索するとTypeScriptの解説が見つかります
Property 'z' does not exist on type 'Point'.- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 type Point = { x: number; y: number }; 2 const raw = { x: 0, y: 0, z: 5 }; 3 const origin: Point = raw; ^ 4 console.log(origin.z);
: Pointという型注釈を付けると、origin自体の型がPointに絞られ、実際には残っているzへアクセスできなくなります。satisfiesならrawの元の型がそのまま保たれ、zにもアクセスできます。
直し方: const origin: Point = raw; を const origin = raw satisfies Point; にします。
パターン2
1 type Item = { name: string }; 2 const raw = { name: "Pen", price: 100 }; 3 const item: Item = raw; ^ 4 console.log(item.price);
: Itemという型注釈を付けるとitem自体の型がItemに絞られ、実際には残っているpriceへアクセスできなくなります。satisfiesならrawの元の型が保たれます。
直し方: const item: Item = raw; を const item = raw satisfies Item; にします。
パターン3
1 type Config = { mode: string }; 2 const raw = { mode: "dark", debug: true }; 3 const cfg: Config = raw; ^ 4 console.log(cfg.debug);
: Configという型注釈はcfgの型をConfigに絞り込みます。実行時にはdebugが残っていても、型の上ではアクセスできません。satisfiesなら元の型のままdebugにアクセスできます。
直し方: const cfg: Config = raw; を const cfg = raw satisfies Config; にします。
よくある誤解
「型注釈を付けると、余分なプロパティは実際に消される」という考えは誤りです。消えるのは型情報の上での見え方だけで、実行時のオブジェクトには元のプロパティがそのまま残っています。
まとめ
型注釈(: Type)はプロパティを消さずに「見えなく」する。satisfiesとの違いは上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。