Upgrade to Pro — share decks privately, control downloads, hide ads and more …

関数型の考えを TypeScript に持ち込んで、テストしやすい純粋関数を増やす / Pur...

関数型の考えを TypeScript に持ち込んで、テストしやすい純粋関数を増やす / Pure at the Core, Effects at the Edge: Bringing Functional Thinking into TypeScript

関数型まつり2026
https://2026.fp-matsuri.org/

関数型の考えを TypeScript に持ち込んで、テストしやすい純粋関数を増やす

Shimmy
ソフトウェアエンジニア

Avatar for 株式会社カミナシ

株式会社カミナシ

July 13, 2026

More Decks by 株式会社カミナシ

Other Decks in Technology

Transcript

  1. アジェンダ 1. 純粋関数と副作用 2. TypeScriptについて、型で表現できないこと 3. FCISという考え 4. アプローチ 1:

    Result型でエラーを値として扱う 5. アプローチ 2: FCISをディレクトリ構造で表現する a. ガードレールを敷く 6. まとめ
  2. TypeScriptの限界 言語 純粋関数 副作用を持つ関数 Haskell Int -> Int Int ->

    IO Int Scala A => B A => IO[B] TypeScript (x: number) => number (x: number) => number 多⾔語との⽐較
  3. 解決策2 副作⽤を端に押し出す ⼊⼒ バリデータ 失敗抽出 dispatch 結果 • ⻘ =

    Functional Core:Result 型を返す純粋関数 • ⾚ = Imperative Shell:副作⽤はここだけ
  4. 副作用の局在化 影響範囲の縮小 結果 得られたもの モック不要のテスト 3 バリデータが、モック不要で ユニットテスト可能 1 2

    副作用がパイプラインの “端”にだけある 配列に1行足すだけで新し いバリデーションが増やせ る 変更が簡単
  5. なぜライブラリを使わなかったか TypeScriptの"⽊⽬"に沿うと ⻑期(数年単位)でメリットがある ライブラリを使う • neverthrow, fp-ts • 独自の語彙の学習コスト ◦

    .map / .andThen • 依存を抱える • TypeScriptの進化の恩恵を受 けづらい fff TypeScriptをそのまま活用する • 人の知識に依存しない • ライブラリに依存しない • 言語の進化に乗れる
  6. How 配置と依存で守る 1. ディレクトリの配置を決める a. domain/ infrastructure/ usecase/ という3層構造 2.

    ディレクトリ間の依存関係を制限する a. domain/ から infrastructure/ や usecase/ への importを禁⽌ 3. domain層で呼べるものも制限 a. I/Oライブラリなどの呼び出しも制限
  7. メリット この構造で得られるもの 1 モック不要のテスト 2 副作用の局在化 2 読みやすさ domain 層は

    純粋関数だけになる 何をするところななのかが ディレクトリで一目でわか る domain 層は 純粋関数だけになる
  8. 2つのアプローチ アプローチ 1 アプローチ 2 背景 既存プロダクト 新規プロダクト 範囲 関数、パイプライン

    プロジェクト全体 アプローチ Result 型でエラーを値に ディレクトリで 層を分ける