📘

valibotというやつを調べてみた

に公開

どんなもの?

スキーマバリデーション用のライブラリー。似ているものとしてzodとyupがあります。

型のチェックだけだったらtypescriptで足りるのでは?

そもそも、tsとスキーマバリデーションが活躍するポジションの違いを書いていきます。(自分の言語化も兼ねて)

typescriptとスキーマバリデーションライブラリーは両方「型をチェックする」という点では同じですが、

tsは開発時に、スキーマバリデーションライブラリーはコード実行時にチェックをしてくれます。

コード実行時に型の検証をしてくれることによって「ランタイムでの外部からのデータ」をアプリケーション内部で型安全に扱えるようになります。

// よくあるaxios経由のリクエスト
interface User {
  id: number;
  name: string;
  email: string;
  age: number;
}

const user = await axios.get<User>('/api/users/1'); // tsではUser型になっているので型に沿って実装する分には問題ない。

console.log(user.data.id); // 実際にAPIのレスポンスがundefinedだったり型と違った場合、アプリケーションコードはその場合に対策されていないので予期せぬエラーが発生する

これが、スキーマバリデーションライブラリーだと

const response = await axios.get('/api/users/1');
const user = v.parse(UserSchema, response.data); // このタイミングでスキーマとデータを検証し、型が一致しない場合、エラーを投げてくれる。

typescriptを使うことで型安全に開発ができるようになったとはいえ、jsにトランスパイルされてからの世界では適切なエラーハンドリングしか方法がありません。

ただ、全てのケースに対してバリデーションを実装するのは大変ですよね…

そこでこのライブラリーを使うと実装コストを大幅に削減しつつもより安全なコードが実装できるようになります。

Zodとはどう違う?

valibotの公式を眺めるとチェックできる型には大きく違いはなささそうです。しいているなら

  • バンドルサイズがより小さい
  • 書き方

くらいですかね。ちなみに私はzod方のの書き方が好きだったりします。

Discussion