Software Design (ソフトウェアデザイン) 2024年05月号を読んで、Union型を使うときの網羅性チェック時にsatisfiesを使う方法を知った
satisfies とは、TypeScript 4.9 で導入された新しい演算子
as const
と組み合わせてwideningを防ぎつつ、型チェックも可能にする
type User = { name: string; age: number; } const user = { name: "John", age: 30, } as const satisfies User;
型注釈user: User
とどう違うのかというと、型注釈では型の推論結果は失われ、user オブジェクトの型情報はUser 型になってしまう
例えば、Userのcolorプロパティの型がunknownだった場合、
type User = { name: string; age: number; color: unknown }
user: User
で型注釈すると、user.color
は型推論結果が失われてunknownになってしまう
const user: User = { name: "John", age: 30, color: "green" }
代わりにsatisfiesを使うと、user.color
が型推論されてちゃんとstring型となる
Union型を使うときの網羅性チェック
switch文でUnion型に新しい型が追加されたときにパターン漏れがないようにする時にsatisfies never
を使うと良い
type MarkerPosition="start"|"end"; function placeMarker(position:MarkerPosition):void { switch(position){ case"start": //positionは"start"型に絞り込まれる console.log(position); break; case"end": //positionは"end"型に絞り込まれる console.log(position); break; default: position satisfies never; } }
case節で網羅できていれば、default節に来たときのpositionはneverになるはずである
この特性を活かし、satisfies never
を定義しておけば、case節に漏れがあったときに型チェックエラーとなる