Каналы ошибок и зависимости
Отслеживайте типизированные ошибки и внедрённые зависимости в эффектах
«Каналы ошибок и зависимости» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.
Каналы ошибок и зависимостей
Два канала делают Effect мощным: типизированный канал ошибок (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 описывает, как создать службу. Предоставление слоя выполняет требование и удаляет его из 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Слои объединяются
Слои могут зависеть от других слоёв и объединяться, создавая полный граф зависимостей. Effect связывает их в правильном порядке на основе их типов.
import { Layer } from "effect";
// Layer.merge(DatabaseLive, LoggerLive)
// Layer that provides both servicesТестирование заменой слоёв
Поскольку зависимости заданы явно, в тестах можно предоставить другой слой, например детерминированный 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 и предоставленные с помощью Layer посредством Effect.provide. Вместе они делают ошибки и зависимости проверяемыми компилятором, а тестирование — простым благодаря замене слоёв.
Часто задаваемые вопросы
Урок «Каналы ошибок и зависимости» бесплатный?
Да — полный текст урока «Каналы ошибок и зависимости» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «Каналы ошибок и зависимости»?
Отслеживайте типизированные ошибки и внедрённые зависимости в эффектах Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Каналы ошибок и зависимости»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Зачем нужны системы эффектов
- Тип Effect
- Композиция эффектов
- Каналы ошибок и зависимости