Closed15
Zodを試す

zodが良さそうな感じがするので、色々試してみる🍁

v1 と v2 あるので、注意!
特別な要件が無ければ、v2で大丈夫な様子⛑
v1版のREADME
v2版のREADME
2020/01 現在、v2はベータ版。
v3版のREADME
どうやら v2 では無く、v3の方が良いらしい。
詳しくは以下のissuesから、

※ 特徴は公式のREADMEより引用。
特徴
- 依存関係なし
- プレーンJavaScript:ブラウザとNode.jsで動作します
- サイズが小さい:8kb minified + zipped
- イミュータブル
- 簡潔で連鎖可能なインターフェース( 要は記述しやすい )
- 関数型アプローチ: parse, don't validate
感想
ブラウザとNode.jsに対応している点はNext.jsとの相性は良さそう。サイズが小さいのもいいね👍
関数型寄りなので、色々とフロントエンドを意識したモノになっている感じかな。

プリミティブ型は当然あるとして、
プリミティブ型の定義
import * as z from 'zod';
// primitive values
z.string();
z.number();
z.bigint();
z.boolean();
z.date();
// empty types
z.undefined();
z.null();
z.void();
// catch-all types
z.any();
z.unknown();
リテラル型も定義できるし、ユニオン型も定義できる。
リテラル型とユニオン型
const tuna = z.literal('tuna');
const twelve = z.literal(12);
const tru = z.literal(true);
const all = z.union([ tuna, twelve, tru ]);
ユニオン型扱るのマジで便利✨
TypeScriptの型もついていて、TypeScriptの良さを存分に存分に味わえるな。
class-validator もいいけど、こっちも良い感じだ。

Parsing
パースはエラーを投げるやつと投げないヤツの両方があるのね。
パース
// 失敗するとエラーを投げる
const stringSchema = z.string();
stringSchema.parse('fish'); // => returns "fish"
stringSchema.parse(12); // throws Error('Non-string type: number');
// 失敗してもエラーを投げない
stringSchema.safeParse(12);
// => { success: false; error: ZodError }
stringSchema.safeParse('billie');
// => { success: true; data: 'billie' }
どちらもTypeScriptの型推論を上手く機能させれるようにしているので、書いていて楽💺

Type guards
Type guardsもあるのね。
const stringSchema = z.string();
const blob: any = 'Albuquerque';
if (stringSchema.check(blob)) {
// blob is now of type `string`
// within this if statement
}
という事は、スキーマを細かく作ってやると良い感じに再利用できるし、細かな判定も出来る感じか🧷
注意
因みに、.safeParse()
については記事で解説しています 👇
Thanks @aiya000
😇

oh... 😇
ヘルパー関数作ってみました 😇
import { ZodType, ZodTypeDef } from 'zod'
export function isValueOf<T>(x: ZodType<T, ZodTypeDef>, y: unknown): y is T {
return x.safeParse(y).success
}
export function ensureValueOf<T>(
x: ZodType<T, ZodTypeDef>,
y: unknown
): asserts y is T {
if (!isValueOf(x, y)) {
throw new Error(`It is not a value of the specified type. value: ${y}`)
}
}
export function requireValueOf<T>(x: ZodType<T, ZodTypeDef>, y: unknown): T {
ensureValueOf(x, y)
return y
}

Type inference
生成したスキーマから、型を生成できる。
const A = z.string();
type A = z.infer<typeof A>; // string
const u: A = 12; // TypeError
const u: A = 'asdf'; // compiles

( ..)φメモメモ

VSCodeの拡張もあるにはあるね。
そのうち、なんか凄いの出そう🙄

以下の記事は、Reactで使えるバリデーションライブラリを分かりやすく比較しているので、とても参考になる💪
このスクラップは2021/02/09にクローズされました
ログインするとコメントできます