valdex - 使いやすいTypeScriptランタイム型アサーションライブラリ
(github.com/asheswook)こんにちは。
一般的に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でインストールして使うことができます。
2件のコメント
シンプルな型に関しては、かなり優れたDXを発揮しそうですね、いやはや
ネストされたオブジェクトや配列にもすべて対応しているので、外部APIやリポジトリを実装する際にも、今のところ気になる点はありませんでした。
関心を持っていただき、ありがとうございます!