5 ポイント 投稿者 asheswook 2025-12-24 | 2件のコメント | WhatsAppで共有

こんにちは。

一般的にTypeScriptのバックエンドを開発していると、エラーが多く発生する箇所はコンパイル時に捕捉されないランタイムの部分だということはご存じだと思います。

たとえば、DB rowをパースするリポジトリ実装外部API通信部分で最も多く発生します。

DBから受け取った値が想定と異なり、ランタイムで値にundefinedが注入されたり、キャスト時に外部から来たプリミティブ値を正しく把握できずヒューマンエラーが発生したりする部分です。

リポジトリを実装する際にも、外部から入ってくるプリミティブ値の型をinterfaceでべたべた書かなければなりません。些細な問題かもしれませんが、楽に使えるように作りました。

実際に外部API部分とDB実装のコードがずっと簡潔になりランタイムで発生するエラーも減りました。

チームでバックエンドに使ってみたところ良さそうだったので、npmに公開しました。

import { validate } from 'valdex';  
  
const data: unknown = await fetchData();  
  
validate(data, {  
  name: String,  
  age: Number,  
  active: Boolean  
});  
  
// TypeScript now knows the exact type of data  
data.name // string  
data.age // number  
data.active // boolean  

上の例は、外部からデータを取得する状況を想定しています。axiosを使っても、mysql2を使っても、postgres pgを使っても適用できます。unknown型で入ってきた値を検証し、正しければその後の制御フローではその値はvalidate()で定義した値としてアサーション(asserts)されます。

もちろんzodのようなライブラリを使うこともできます。

zodとvaldexの違いは、valdexはスキーマをインスタンスとして作成して使うのではなく、データを受け取る場所の中で宣言的にデータ型を扱えるという点です。インターフェースを修正するために、DTOクラスを修正するために、あちこち行き来しながらコードを直す必要がありません。

npm i valdex  

npmでインストールして使うことができます。

Github: https://github.com/asheswook/valdex

2件のコメント

 
sunrabbit 2025-12-24

シンプルな型に関しては、かなり優れたDXを発揮しそうですね、いやはや

 
asheswook 2025-12-24

ネストされたオブジェクトや配列にもすべて対応しているので、外部APIやリポジトリを実装する際にも、今のところ気になる点はありませんでした。
関心を持っていただき、ありがとうございます!