- "The missing Standard Library for TypeScript"
- 複雑な同期/非同期プログラムを簡単に作れるように設計
- コードをより Composable、Reusable、Testable に
- Maximum Type-Safety(エラーハンドリングを含む)
- 多様なライブラリを提供
- クラスタリングとワークフローを提供(アルファ版)
- 幅広い互換性
- Node, Deno, Bun, Cloudflare Workers, Chrome
- React, Solid.JS, Vite, Next.JS, Tauri
- 主な特徴
- 並行性(Concurrency): Fiber ベースの並行性モデルにより、高い拡張性と超低レイテンシのアプリケーションを実現可能
- 組み合わせ性(Composability): 小さく再利用可能な構成要素を使って、保守しやすく読みやすく柔軟なソフトウェアを構築可能
- リソース安全性(Resource Safety): プログラムが失敗しても、リソースの取得と解放を安全に管理可能
- 型安全性(Type Safety): 型推論と型安全性を重視しており、TypeScript の型システムを最大限に活用可能
- エラー処理(Error Handling): 組み込みのエラー処理機能を使って、構造化され信頼性の高い方法でエラーを処理可能
- 非同期性(Asynchronicity): コードが同期的でも非同期的でも同じように見える形で記述可能
- 観測可能性(Observability): 完全なトレーシング機能により、プログラムの実行を簡単にデバッグおよび監視可能
なぜ Effect なのか?
- プログラミングは難しい
- ライブラリやアプリを作るとき、多くのツールを使って複雑さを管理する
- Effect は TypeScript プログラミングに対する新しい考え方を提示する
- Effect エコシステムのツールを通じて、より優れたアプリケーションやライブラリを構築できる
- これにより TypeScript 言語と型システムをより深く理解し、プログラムをより信頼性が高く保守しやすいものにできる。
Effect パターン
- 一般的な TypeScript コードでは、関数は成功するか例外を投げると想定される
- 例:
divide 関数は 0 で割ると例外を投げる
- 型だけを見ても、この関数が例外を投げうることは分からない
- コードベースに数百、数千の関数があると、この問題は大きくなる
- 例外処理は忘れやすく、管理もしにくい
- TypeScript のコンパイラは、バグ、ドメインエラー、一般的な複雑さに対する第一の防衛線である
Effect パターンを適用する
- Effect の重要な洞察は、成功値だけでなくエラーと「コンテキスト」を追跡するために型システムを使えるということ
- 例:
divide 関数の Effect 版は例外を投げず、エラーを呼び出し元に渡す
- エラーと成功値を管理する機能を提供
- コンテキスト追跡により、すべての引数を渡さなくても関数に追加情報を提供できる
- 例: テスト中に外部サービスの実際の実装をモックに置き換えることが可能
import { Effect } from "effect"
const divide = (a: number, b: number): Effect.Effect<number, Error, never> =>
b === 0
? Effect.fail(new Error("Cannot divide by zero"))
: Effect.succeed(a / b)
Effect エコシステム
- Effect の独自の洞察と他のツールが組み合わさることで、複雑なアプリケーションを簡単に作れる豊かなライブラリエコシステムが形成されている
- 以前は不可能に思えたことが、いまでは当たり前になっている
- Effect エコシステムは急速に成長しており、Effect の GitHub で確認できる
車輪の再発明をしないこと
- TypeScript アプリケーションコードでは、同じ問題を繰り返し解決しがちである
- 外部サービス、ファイルシステム、データベースとの相互作用は、すべてのアプリケーション開発者に共通する課題である
- Effect は、こうした問題に対する標準化されたソリューションを提供する豊富なライブラリエコシステムを提供する
- 複数の依存関係をインストールする必要なく、Effect は多くの問題をまとめて解決する
実用的な問題解決
- Effect は Scala と Haskell に着想を得ている。
- しかし Effect の目標は、実用的なツールキットを提供し、TypeScript アプリケーションやライブラリを構築する際に直面する日常的な問題を解決することにある
楽しみながら学ぶ
- Effect を学ぶのは楽しい
- 多くの開発者が実務で Effect を使って実際の問題を解決している
- まずは Effect エコシステムの一部から使い始め、徐々により多くのツールを活用できる
- 最初は Effect の概念がなじみにくいかもしれないが、ドキュメントを読み、核心概念を理解する時間を取れば、後でより高度なツールを使うときに役立つ
- Effect コミュニティは常に学習と成長を支援する準備ができている。Discord や GitHub を参照のこと
3件のコメント
Rustが持っている核心とかなり似た軌道を描いていますね。
もう少し使ってみないと分からないですが、fp-ts と比べるとはるかに快適に使えますね
fp-ts は 3.0 の開発を行わず、effect に合流することになりました。
fp-ts を使っているなら、effect を検討してみるとよいでしょう。
https://x.com/MichaelArnaldi/status/1626975031048773635
https://effect.website/docs/other/fp-ts