このツールの動作
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だけで完結します。データがアップロードされることはないため、機密情報でも安心して利用でき、オフラインでも動作します。