エラーチャネルと依存関係
エフェクト内の型付きエラーと注入された依存関係を追跡します。
「エラーチャネルと依存関係」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。
エラーチャネルと依存関係
Effect を強力にするのは、2つのチャネルです。型付けされたエラーチャネル(E)と、要件チャネル(R)です。このレッスンでは、型付けされたエラーで失敗する方法と、ContextおよびLayerを使って依存関係を提供する方法を学びます。
Effect.fail による型付きエラー
Effect.failは値をエラーチャネルに入れます。タグ付きクラスを使うと、エラーを簡単に判別できます。
import { Effect } from "effect";
class NotFound { readonly _tag = "NotFound"; }
class Forbidden { readonly _tag = "Forbidden"; }
const load = Effect.fail(new NotFound());
// Effect<never, NotFound, never>合成するとエラーはユニオンになる
異なるエラーを持つエフェクトを順番に実行すると、それらのエラーが E チャネルでユニオンになります。そのため、型にはすべての失敗の可能性が列挙されます。
// Effect<A, NotFound, never> then Effect<B, Forbidden, never>
// => Effect<B, NotFound | Forbidden, never>エラーを処理する
Effect.catchAllまたはcatchTagでエラーを処理すると、エラーがチャネルから取り除かれるか、別のエラーに置き換えられます。NotFound を処理すると、E が絞り込まれます。
import { Effect, pipe } from "effect";
const safe = pipe(
Effect.fail(new NotFound()),
Effect.catchTag("NotFound", () => Effect.succeed("default"))
);
// Effect<string, never, never> -- error handled回復と伝播
エラーを処理しなければ、そのエラーは E に残り、呼び出し元へ伝播します。呼び出し元はそのエラーを処理するか、さらに伝播させる必要があります。コンパイラーによって、エラーが暗黙のうちに失われないことが保証されます。
依存関係を宣言する
サービスはContext.Tagとして宣言します。そのサービスを使うエフェクトでは、R チャネルにそのサービスが追加されます。
import { Context, Effect } from "effect";
class Random extends Context.Tag("Random")<
Random,
{ readonly next: Effect.Effect<number> }
>() {}
const program = Effect.gen(function* () {
const random = yield* Random;
return yield* random.next;
});
// Effect<number, never, Random>要件は型に現れる
R チャネルにRandomが含まれていることに注目してください。その要件が満たされるまで、エフェクトは実行できません。このことをコンパイラーが強制します。
Layer で提供する
Layerは、サービスの構築方法を表します。Layer を提供すると要件が満たされ、その要件が R から取り除かれます。
import { Effect, Layer } from "effect";
const RandomLive = Layer.succeed(Random, {
next: Effect.sync(() => Math.random()),
});
const runnable = Effect.provide(program, RandomLive);
// Effect<number, never, never> -- R clearedLayer を合成する
Layer は他の Layer に依存でき、互いに結合して完全な依存関係グラフを構築できます。Effect は型に基づいて、正しい順序でそれらを接続します。
import { Layer } from "effect";
// Layer.merge(DatabaseLive, LoggerLive)
// Layer that provides both servicesLayer を差し替えてテストする
依存関係が明示されているため、テストではプログラム本体に触れずに別の Layer(たとえば決定論的な Random)を提供できます。これは要件を追跡できることの大きな利点です。
import { Layer, Effect } from "effect";
const RandomTest = Layer.succeed(Random, {
next: Effect.succeed(0.5),
});
// Effect.provide(program, RandomTest) -> deterministicなぜ重要なのか
エラーチャネルと要件チャネルによって、見えない前提がコンパイラーによって検証される契約になります。すべての失敗は処理するか宣言する必要があり、すべての依存関係は提供する必要があります。これにより、大規模な Effect プログラムの堅牢性とテストのしやすさが実現します。
理解度チェック
エラーチャネルと依存関係について、理解度を確認しましょう。
まとめ
エラーチャネルは型付きの失敗(Effect.failで作成し、catchTagやcatchAllで絞り込みます)を追跡し、エフェクトを合成するとそれらがユニオンになります。一方、要件チャネルはContext.Tagで宣言したサービスを追跡し、Effect.provideを通じてLayerで満たします。これらを組み合わせることで、失敗と依存関係がコンパイラーによって検証され、Layer の差し替えによってテストも簡単になります。
よくある質問
「エラーチャネルと依存関係」レッスンは無料ですか?
はい。「エラーチャネルと依存関係」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。
「エラーチャネルと依存関係」で何を学びますか?
エフェクト内の型付きエラーと注入された依存関係を追跡します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
TypeScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「エラーチャネルと依存関係」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTypeScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- エフェクトシステムが重要な理由
- Effect型
- エフェクトの合成
- エラーチャネルと依存関係