🐥

【TS】Effect触ってみた

2024/03/10に公開

はじめに

effect という typescript のライブラリを最近見かけたのでどんなもんか触ってみようと思う
記事を読み終えた頃に effect ってなんなの?っていう状態からなんとなくこんなもんかと分かる状態を目指そうと思う

effect とは?

まず初めに、effect ってなんなの?ってことで公式ドキュメントを見てみると下記のような説明がある

  • What is Effect?
    Effect is a powerful TypeScript library designed to help developers easily create complex, synchronous, and asynchronous programs.

要するに開発者が複雑な同期、非同期プログラムを簡単に作成できるように設計された typescript ライブラリらしい

今んとこよくわからない

別で調べてみたらこんな感じだった

effect はエラーや非同期処理を安全に扱うための方法を提供し、型システムを活用してプログラムの正確さを向上させるためのライブラリ

イマイチイメージが湧かないので具体的なコード例を見ながら探っていく

使い方

もうちょっと公式ドキュメントを読み進めていくと使用例が書いてあったので見ていく
除算プログラムを使った例

下記は effect を使用しないパターン

const divide = (a: number, b: number): number => {
  if (b === 0) {
    throw new Error("Cannot divide by zero");
  }
  return a / b;
};

例外があれば throw しているよくある感じ
この関数が例外をスローするかは型からは分からず、実際にコードを読み進めて初めて分かることである
こんな簡単な関数ならすぐ読めるが、もっと複雑な関数ならどうだろう?

今度は effect を使用したパターン

import { Effect } from "effect";

const divide = (a: number, b: number): Effect.Effect<number, Error> =>
  b === 0
    ? Effect.fail(new Error("Cannot divide by zero"))
    : Effect.succeed(a / b);

型を見れば例外があることが分かり、成功値が number であることもわかる
また、エラーも成功値と同じように値で返すことで関数はエラーをスローしなくなり、関数の呼び出し元にエラーを返すことができる

一例ではあるが、なんとなく雰囲気はわかってきた
でも、これができると何が嬉しいの、、、?

もう一歩踏み込んでいく

もう少しドキュメントを読んでいくとそれについても言及されていた

const divide = (a: number, b: number): number => {
  if (b === 0) {
    throw new Error("Cannot divide by zero");
  }
  return a / b;
};

上記のように関数の型が例外をスローする可能性を示していない場合、潜在的なエラーを推論するのがとても難しい
この問題に対処するために、Effect では、成功と失敗の両方を表す専用のコンストラクター Effect.succeed/Effect.fail を使用してエラーを追跡しながら、成功ケースと失敗ケースを明示的に処理できるようにした

そのような視点でもう一度下記のサンプルコードを見てみると確かに分かりやすい
型を見れば例外の可能性も分かるし、成功した場合の挙動も一目でわかる

import { Effect } from "effect";

const divide = (a: number, b: number): Effect.Effect<number, Error> =>
  b === 0
    ? Effect.fail(new Error("Cannot divide by zero"))
    : Effect.succeed(a / b);

ここまでで effect を使用した場合と使用しない場合で何が違うのか雰囲気わかってきたのではないだろうか?

まとめ

今上記で見てきたのはほんの一例であり、effect を使えばもっといろんなことできる
(エラー処理、デバッグ、トレース、非同期/プロミス、再試行、ストリーミング、同時実行、キャッシュ、リソース管理などの課題の管理が、Effect を使用して管理可能になると公式ドキュメントに書いてあった)
全部をマスターするのはすぐにはできないが、少しずつ触ってみて、より保守性の高いコードが書けるようになりたい

Discussion