100% ローカル — データがブラウザの外に出ることはありません

JSONをio-tsに変換|復号と型定義をまとめて手に入れる

JSONのサンプルをio-tsのコーデックに変換します。オブジェクトごとに一つ、使う前に宣言され、TypeOf を使えば同じ宣言から静的な型もそのまま取り出せます。

高速 プライベート Cookieゼロ

JSON 入力

io-ts 出力

このツールの動作

JSON の標本が io-ts のコーデックになります。オブジェクト一つにつき const が一つです。

{ "id": 1, "name": "Ada", "address": { "city": "Paris" } }
import * as t from "io-ts";

export const Address = t.type({
  city: t.string,
});

export const Root = t.type({
  id: t.Int,
  name: t.string,
  address: Address,
});

子が先に宣言されます。コーデックは実行時の値であり、別のものから名指しされる前に存在していなければならないからです。根が配列なら、その配列にもコーデックがつきます——export const Users = t.array(UsersItem);——あなたに書かせたりはしません。

t.Int は印のついた型で、それは表に出る

t.Int は t.number の絞り込みで、整数であることの証を帯びています。したがって t.TypeOf<typeof Root> は { id: Int; … } であって { id: number; … } ではありません。Int は number の求められる場所へ行けますが、逆には復号が要ります。その摩擦に見合わないと感じるなら、t.number は一語の置き換えです。

どちらになるかは数値の書かれ方で決まります。3 は t.Int、10.0 は t.number です。少し前まで 10.0 も t.Int になり、コーデックは 10.5 を——次の一件を——拒んでいました。本物の欠陥で、これらの頁を書く過程で見つけ、直しました。

コーデックが通すもの

t.type は知っているものを検査し、残りは見ません。項目が三つ余計にある応答も、きれいに復号されます。これが io-ts のインタフェース意味論であり、他人の API を読むときの正しい既定です。予期しない鍵を誤りにしたいなら、同じ形を t.strict で包んでください。取り除きたいなら t.exact です。

復号は一行で

import { isRight } from "fp-ts/Either";

const result = Root.decode(payload);
if (isRight(result)) { /* result.right に型がつく */ }

PathReporter.report(result) は失敗を読める経路に変えます。正しいと思っていた荷をコーデックが初めて拒んだとき、手元にあると助かります。

すべては必須

標本のすべての鍵が t.type に入ります。つまり必須です。io-ts は省略可能を別の t.partial に書き、t.intersection でつなぎます。鍵を二つの側へ振り分けることは API についての主張であり、文書ひとつがあなたの代わりに行えることではありません。

プライバシー

すべての処理はブラウザ内のJavaScriptだけで完結します。データがアップロードされることはないため、機密情報でも安心して利用でき、オフラインでも動作します。

よくある質問

`t.type` は余分なプロパティを拒みますか。
拒みません。`t.type` は知っているプロパティを検査し、残りは通します。io-ts がインタフェース・コーデックと呼ぶ挙動です。`t.exact` は余分を取り除き、`t.strict` は拒みます。生成器が `t.type` を出すのは、三つのどれが欲しいかを標本が言えないからです。あなたの API についての判断です。
なぜ `t.TypeOf` は `number` ではなく `Int` を返すのですか。
`t.Int` は印のついた型だからです。`Int` は、整数として検証された証を帯びた `number` です。`Int` を `number` に入れるのは通り、逆には復号が要ります。どこでも素の数値がよければ、`t.Int` を `t.number` に置き換えてください。整数の検査は失われます。
すべての項目が必須ですか。
必須です。標本ひとつが支えられるのはそこまでです。io-ts は省略可能を `t.partial` で書き、たいてい `t.intersection([t.type({…}), t.partial({…})])` として組み合わせます。どの鍵をどちらに入れるかは API を知ることであって、文書を一つ読むことではありません。交差はあなたに残します。

関連ツール