0Pricing
TypeScript Academy · レッスン

エラーチャネルと依存関係

エフェクト内の型付きエラーと注入された依存関係を追跡します。

「エラーチャネルと依存関係」は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 cleared

Layer を合成する

Layer は他の Layer に依存でき、互いに結合して完全な依存関係グラフを構築できます。Effect は型に基づいて、正しい順序でそれらを接続します。

import { Layer } from "effect";
// Layer.merge(DatabaseLive, LoggerLive)
// Layer that provides both services

Layer を差し替えてテストする

依存関係が明示されているため、テストではプログラム本体に触れずに別の 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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. エフェクトシステムが重要な理由
  2. Effect型
  3. エフェクトの合成
  4. エラーチャネルと依存関係
← TypeScript Academyに戻る