20251028

2025/10/28

zod

https://zod.dev/

データのバリデーションを行うライブラリ。

あらかじめスキーマを宣言しておき、ネットから取得したデータやユーザーから受け取ったデータがそのスキーマに則っているかどうかをバリデーションできる。

バリデーションには parse()sefeParse() を使用する。

バリデーションエラーがある場合には ZodError が投げられ、どこにエラーがあるのかも教えてくれる。try/catchしたくない場合のために、 sefeParse() ではバリデーション結果をオブジェクトで受け取ることができる。

スキーマ宣言はただの型宣言だけでなく、受け取った値の型と出力する値の型の変換も宣言できる。例えばフォームから入力された値は基本的に文字列となるが、数値として扱いたい場合がある。その際に文字列から数値に変換する旨を宣言しておけば parse() をかけた後の戻り値を数値として取得できる。

さらにzodでは作成したスキーマ宣言から型を抽出してTypeScriptの型として使えるというどういう仕組みなのかよくわからない機能も持つ。

スキーマ宣言の例

// 公式サイトより

import * as z from "zod"; 
 
const Player = z.object({ 
  username: z.string(),
  xp: z.number()
});

Player はスキーマ宣言のインスタンスとなる。この場合はTypeScriptでいうところの

type Player = {
  username: string;
  xp: number;
}

と同じ意味のスキーマとなる。

スキーマ宣言のインスタンスはバリデーション関数として parse を持つため、

Player.parse({ username: "billie", xp: 100 }); 

このようにすれば与えた引数に対してバリデーションをを行うことができる。

バリデーションが成功した場合は与えた引数のディープクローンが返され、失敗した場合は ZodError が投げられる。

より複雑なスキーマ宣言の例

import * as z from "zod"; 

const Player = z.object({
  id: z.guid(); // GUID
  username: z.string().max(255), // 255文字以下の文字列
  gender: z.literal(['man', 'woman']), // 'man' または 'woman'
  age: z.number().gte(20).lte(100); // 20以上100以下の数値
});

TypeScriptでは表せない型の宣言も可能。

他にもさまざまな宣言方法がある。

https://zod.dev/api