UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【TypeScript】Union型を使うときの網羅性チェック時にsatisfiesを使う

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