io-ts
TypeScriptで実行時型検査するLibrary
内部でfp-tsを使っている
開発者はGiulio Canti
docs
基本的にはindex.tsからimportする
他のmoduleからreexportされてる
github
about
io-tsとTypeScriptの型の対応
できること
ランタイム型検査
健全性が破壊されるのは、(ちゃんとやっていれば)IO部分だけなので、という感じでio-tsという命名なんだろうmrsekut.icon
The ideaに書いてる
User.decode(maybeUser)みたいに、decode()を使えば良い
通常のts型での定義とここのみが異なるので、projectの他の部分に影響は特にない
Type Predicatesを自動で生成
.is()を使う
https://qiita.com/aiya000/items/f058701d290eaede6f48
branded types
https://gcanti.github.io/io-ts/modules/index.ts.html#brand
https://github.com/gcanti/io-ts/blob/master/index.md#branded-types--refinements
newtype-tsを使っても良いかもmrsekut.icon
Exact型
https://github.com/gcanti/io-ts/blob/master/index.md#exact-types
型の自作もできる
https://github.com/gcanti/io-ts/blob/master/index.md#custom-types
自作でISO文字列のDate型を作る例
ちなみにDate型はio-ts-typesにもある
関連
io-ts-reporters
decodeしたときに出力される文字列をいい感じに整形してくれる
https://github.com/gillchristian/io-ts-reporters
PathReporterとは何が違うのか #??
io-ts-types
#??
元々、without io-tsでItemという型を定義している状態で、
with io-tsで新しい型Hogeを定義しする時に、
内部でItemを使いたい、って時に、定義できるの?
code:ts
const Hoge = t.type({
aaa: t.string,
item: t.???
})
これが無理だと、依存がでかい型をwith io-tsに移すためには、ほぼ全部書き換えが必要になるのか
あとは、URLのように、built-inの型を用いた定義ができない?
io-ts#613df0e019827000002b1a38でやるのか
ちなみに、逆は行ける
不満
型定義がひたすらだるい
既存の実装の移行の場合は、割と工数を取っておいたほうが良い
TSのdefaultよりもずっと型安全にできるため、良い機会ではある
変換するやつもあるっぽい
試してないけどmrsekut.icon
元のsyntaxよりもごちゃごちゃして見づらい
constで定義することになるので、定義位置に制限が入る
子をfileの上の方に書かないといけない
外部で型を使いたい時に、毎度t.TypeOf<typeof Hoge>と書いてられないから、そこで定義することになると思うけど、そうしても2回定義しないといけないのがめんどいな
code:ts
const Hoge = t.type({..})
type Hoge = t.TypeOf<typeof Hoge>