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節に漏れがあったときに型チェックエラーとなる