TypeScriptではリテラルの型指定にはキャストではなくsatisfiese演算子を使う

よく以下のように、キャスト{} as Tを使ってリテラルに型指定をしているコードを見る。

type User = {
  id: string;
  name: string;
};

const value1 = {
  user: {} as User,
};

しかし、このコードは型安全ではなく、存在しないプロパティがある場合や必要なプロパティが不足している場合であってもエラーにならない。そのため嘘の型情報を付与してしまい、実質的に型安全でなくなる。

これを防ぐために以前はliteralという簡単なヘルパー関数を作って対応していた。

type User = {
  id: string;
  name: string;
};

function literal<T>(value: T): T {
  return value;
}

const value2 = {
  user: literal<User>({
    id: '1',
    name: 'name 2',
  }),
};

このようにすれば型安全になり、嘘の型情報を付与することがなくなる。

しかし、TypeScript 4.9 から satisfies演算子というものが導入されたので、これを使うと上記と同様のことができるようになった。

type User = {
  id: string;
  name: string;
};

const value3 = {
  user: {
    id: '1',
    name: 'name 3',
  } satisfies User,
};

そのため、TypeScript 4.9 以上を使用しているのであれば、リテラルへの型指定にはsatisfies演算子を使うとよい。


参考: