Slide 1

Slide 1 text

TypeScript で Railway Oriented Programming 型安全なエラーハンドリングを作る コネヒト・千合同懇親会 @daitasu

Slide 2

Slide 2 text

TypeScript の例外処理に Railway Oritented Programming を使おう!

Slide 3

Slide 3 text

Railway Oriented Programming(ROP) ● 2014年にScott Wlaschinさんによって提唱 ● 関数型プログラミングにおける、エラーハンドリングの取り扱いに焦点を当てた 実装手法 ● 関数を「成功」と「失敗」の2つの分岐がある 線路(レール) に見立てる

Slide 4

Slide 4 text

Railway Oriented Programming ● 1つの関数が1つ のinput に対し、2つの output パターンを持つ 成功! 失敗... function input

Slide 5

Slide 5 text

Railway Oriented Programming ● 「成功」時は次の処理へ、「失敗」時は何もせず通過する validateLength validateEmail on success bypass

Slide 6

Slide 6 text

Railway Oriented Programming ● 各関数の連結 → 成功時のみ値が残り、失敗時は最初のエラー情報が最後 まで届く validateLength validateEmail extractDomain

Slide 7

Slide 7 text

Result 型とは ● ROP に則った型定義 ● 言語によって命名が微妙に異なる ● Result 型 ○ Success と Failure の Union 型 ● Result 型を受けてResult型を返す処理も 一緒に必要(Scala だと flatMap 関数) ○ Success 受取り時: 次の関数を実行 ○ Failure 受取り時: 何もせず次へ

Slide 8

Slide 8 text

何が嬉しいの? 

Slide 9

Slide 9 text

手続き的な例外処理のつらみ Error Handling を 各関数で意識する必要がある (考慮漏れの懸念) TSのtry catch は エラー情報の型を持たない → どのエラーか分からん

Slide 10

Slide 10 text

Result 型を適用する 返り値の型を Result 型へ → 型エラーで Handling 漏れに気付ける Success時:値が返却 Error時:エラー箇所の情報を保持 エラー処理の入れ子が減って、 処理が追いやすくなる

Slide 11

Slide 11 text

まとめ ● 手続き的エラーハンドリングはしんどい ○ try catch の入れ子の増加と対応漏れの発生 ○ 例外の型が伝播されない ● Result はオススメ ○ ROP によって例外処理の漏れを型安全に防止できる ○ try catch の入れ子を脱せて、煩雑化を防げる ● TS 標準の型ではない ○ TS 標準の型ではなく、オレオレ型定義が生まれる ○ 用法・用量を守って症状を見ながらの使用に留める

Slide 12

Slide 12 text

記事 https://daitasu.hatenablog.jp/entry/2025/03/04/090000 TypeScript の例外処理を Railway Oriented Programming(Result 型) で楽にしたい