io-ts
基本的には index.ts
からimportする
他のmoduleからreexportされてる
できること
ランタイム型検査
健全性が破壊されるのは、(ちゃんとやっていれば)IO部分だけなので、という感じでio-tsという命名なんだろう

User.decode(maybeUser)
みたいに、 decode()
を使えば良い
通常のts型での定義とここのみが異なるので、projectの他の部分に影響は特にない
.is()
を使う
型の自作もできる
自作でISO文字列のDate型を作る例
関連
decodeしたときに出力される文字列をいい感じに整形してくれる
元々、without io-tsで Item
という型を定義している状態で、
with io-tsで新しい型 Hoge
を定義しする時に、
内部で Item
を使いたい、って時に、定義できるの?
tsconst Hoge = t.type({
aaa: t.string,
item: t.???
})
これが無理だと、依存がでかい型をwith io-tsに移すためには、ほぼ全部書き換えが必要になるのか
あとは、 URL
のように、built-inの型を用いた定義ができない?
ちなみに、逆は行ける
不満
型定義がひたすらだるい
既存の実装の移行の場合は、割と工数を取っておいたほうが良い
TSのdefaultよりもずっと型安全にできるため、良い機会ではある
試してないけど

元のsyntaxよりもごちゃごちゃして見づらい
const
で定義することになるので、定義位置に制限が入る
子をfileの上の方に書かないといけない
外部で型を使いたい時に、毎度 t.TypeOf<typeof Hoge>
と書いてられないから、そこで定義することになると思うけど、そうしても2回定義しないといけないのがめんどいな
tsconst Hoge = t.type({..})
type Hoge = t.TypeOf<typeof Hoge>