Closed15

Zodを試す

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

※ 特徴は公式の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()については記事で解説しています 👇

https://zenn.dev/uttk/articles/bd264fa884e026#.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
このスクラップは2021/02/09にクローズされました
ログインするとコメントできます