JSONからの皮肉な型 — Numio
JSON サンプルから、実行時型チェックライブラリ sarcastic 用のバリデーターを生成します。オブジェクトは is.shape({...})、配列は is.arrayOf(...) になり、配列の一部の要素にしかないキーは is.maybe(...) で囲まれます。
スキーマライブラリを使わない小さな JavaScript プロジェクトで、取得した JSON の形を実行時にチェックする。
JSON
Sarcastic
こんなときに使えます
- スキーマライブラリを使わない小さな JavaScript プロジェクトで、取得した JSON の形を実行時にチェックする。
- 想定外のデータで例外を投げるアサーションで、設定やメッセージのペイロードを守る。
使い方
- JSON オブジェクトを貼り付けます。フィールドを省略可能にするには、そのフィールドを持つ配列要素と持たない要素を含めます。
- 出力を確認します。ルートの shape は RootInterface で、ネストした shape はキー名から命名されます(posts は Posts になります)。
- コードをコピーし、is(data, RootInterface) でデータを検証します。一致すれば値を返し、一致しなければ例外を投げます。
JSON 入力
{
"id": 1,
"name": "Ada",
"nickname": null,
"tags": ["math"],
"posts": [
{ "title": "Notes", "draft": true },
{ "title": "Engine" }
]
}Sarcastic バリデーター
import is from "sarcastic"
const anyValue = (value) => value
const Posts = is.shape({
title: is.string,
draft: is.maybe(is.boolean),
})
const RootInterface = is.shape({
id: is.number,
name: is.string,
nickname: is.maybe(anyValue),
tags: is.arrayOf(is.string),
posts: is.arrayOf(Posts),
})仕様と制限
サイト独自のジェネレーターでブラウザ内で生成され、import is from "sarcastic" の追加と Prettier による整形が行われます。サーバーへのリクエストはありません。
sarcastic には "any" のアサーションがないため、常に null の値は is.maybe(anyValue) になり、出力に小さなヘルパー const anyValue = (value) => value が追加されます。
整数も小数も is.number です。空配列は is.array になり、型が混在する配列は is.arrayOf(is.either(is.number, is.string)) のように is.either を使います。
shape はそれを使う shape より前に宣言されるため、貼り付けたまま実行できます。
FAQ
省略可能なフィールドはどう表されますか?
同じ配列内の一部のオブジェクトで欠けているキーや null のキーは is.maybe(...) で囲まれ、null と undefined を受け付けます。単一オブジェクトの最上位のキーは常に必須です。
ルートが配列の場合はどうなりますか?
要素が 1 つの要素を表す RootInterface shape にマージされ、配列全体を表す const RootInterfaceList = is.arrayOf(RootInterface) が追加されます。
sarcastic は io-ts や Zod と同じものですか?
いいえ。sarcastic はより小さなライブラリで、静的な型推論はありません。TypeScript の型も必要なら JSON → Zod や JSON → io-ts のほうが適しています。