transform-ts
自分が作っているライブラリ
外部との境界面(API/DB)での値の検証/変換を行うライブラリ
ジャンルとしてはランタイム型チェッカー
既存のライブラリとはどう違うのか
これらは値の検証しか行わない(io-tsには変換の機能もあるが…後述)
transform-ts は値を変換することができ、その変換を合成することができる
値を変換できるとどう便利なのか
例えば、JSONで { a: 10, b: 'hoge', c: new Date('2019-10-04T02:14:04.147Z')} をシリアライズすることを考える
Date は直接シリアライズできないので ISO8601 で表現された文字列にエンコードする
そうすると、{ "a": 10, "b": "hoge", "c": "2019-10-04T02:14:04.147Z" } になる
このとき、「c が元々Dateであった」という情報は失われてしまう
つまり、これをデコードする側がこの情報を付与してやる必要があるが、値の検証しかできないライブラリは、これをうまく扱うことができない
「cがISO8601文字列である」ことを検証してからプログラマが new Date(obj.c) のようなコードを書いてDateにしてやる必要がある
transform-ts は、変換と変換の合成によって unknownからDate への変換をつくり、宣言的にプログラムにとって必要な値を定義することができる
より一般的には、JSONは「オブジェクトを文字列を使って表現する」プロトコルで、ISO8601は「時刻を文字列を使って表現する」プロトコルで、先程の例はJSONというプロトコルの上にISO8601というプロトコルが乗っていると言うことができる
そして、transform-ts はプロトコルを変換(内部ではTransformerと呼ばれている)として扱うことで、プロトコルの上に新たなプロトコルが乗せられている状況でも、そのプロトコルで表現された値を正しくデコードできる(_実はエンコードもできる廃止されました)