0Pricing
TypeScript Academy · Урок

Композиция эффектов

Объединяйте эффекты в цепочки с помощью pipe и генераторов

«Композиция эффектов» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.

Композиция эффектов

Эффекты являются значениями, поэтому программы создаются путём их композиции. Основные инструменты — Effect.pipe, Effect.map, Effect.flatMap и синтаксис на основе генераторов Effect.gen.

pipe: передача через функции

pipe передаёт эффект через последовательность преобразований слева направо, избегая глубокой вложенности.

import { Effect, pipe } from "effect";

const program = pipe(
  Effect.succeed(2),
  Effect.map((n) => n + 1),
  Effect.map((n) => n * 10)
);
// Effect<number, never, never> producing 30

map: преобразование успешного значения

Effect.map применяет чистую функцию к успешному значению, не изменяя каналы ошибок и требований.

import { Effect } from "effect";

const doubled = Effect.map(Effect.succeed(21), (n) => n * 2);
// Effect<number, never, never>

flatMap: последовательное выполнение эффектов

Если следующий шаг сам является эффектом, используйте flatMap, также называемый chain. Он выполняет первый эффект, а затем передаёт его значение функции, возвращающей другой эффект.

import { Effect, pipe } from "effect";

const getId = Effect.succeed(1);
const loadUser = (id: number) => Effect.succeed({ id, name: "Ada" });

const program = pipe(getId, Effect.flatMap(loadUser));
// Effect<{ id: number; name: string }, never, never>

map и flatMap

Используйте map, когда функция возвращает обычное значение, и flatMap, когда она возвращает эффект. Использование map с функцией, возвращающей эффект, приводит к вложенному эффекту.

Каналы накапливаются

При последовательном выполнении эффектов их типы ошибок объединяются, как и типы требований. Тип составного эффекта отражает всё, что может завершиться с ошибкой, и всё необходимое для выполнения.

// Effect<A, E1, R1> then Effect<B, E2, R2>
// => Effect<B, E1 | E2, R1 | R2>

Effect.gen: синтаксис генераторов

Effect.gen позволяет писать последовательный код эффектов, похожий на async/await, используя yield* для извлечения значения из каждого эффекта.

import { Effect } from "effect";

const program = Effect.gen(function* () {
  const id = yield* Effect.succeed(1);
  const user = yield* Effect.succeed({ id, name: "Ada" });
  return user.name;
});
// Effect<string, never, never>

gen и pipe

gen понятнее для линейных потоков из нескольких шагов с промежуточными переменными, а pipe особенно удобен для коротких цепочек преобразований. Они свободно взаимодействуют друг с другом.

Объединение независимых эффектов

Effect.all выполняет несколько эффектов и собирает их результаты, накапливая ошибки и требования от каждого из них.

import { Effect } from "effect";

const both = Effect.all([Effect.succeed(1), Effect.succeed("x")]);
// Effect<[number, string], never, never>

По-прежнему лениво

Всё это только описывает программу. Ничего не выполняется, пока Вы не запустите её на границе системы с помощью Effect.runPromise или Effect.runSync.

import { Effect } from "effect";
// const result = await Effect.runPromise(program);

Почему это важно

Композиция делает эффекты практичными: Вы собираете небольшие типизированные части в большие программы, а компилятор отслеживает каждую ошибку и зависимость. map, flatMap, pipe и gen — повседневные глаголы кода Effect.

Быстрая проверка

Проверьте, насколько хорошо Вы поняли композицию эффектов.

Итоги

Вы составляете эффекты с помощью map (преобразование успешных значений), flatMap (последовательное выполнение шагов, возвращающих эффекты), pipe (передача результата через преобразования) и Effect.gen (синтаксис генераторов, похожий на ожидание). Каналы ошибок и требований накапливаются в виде объединений, а выполнение не начинается, пока Вы не запустите программу на границе приложения.

Часто задаваемые вопросы

Урок «Композиция эффектов» бесплатный?

Да — полный текст урока «Композиция эффектов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.

Чему я научусь в уроке «Композиция эффектов»?

Объединяйте эффекты в цепочки с помощью pipe и генераторов Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать TypeScript Academy?

Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Композиция эффектов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке TypeScript Academy?

Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Зачем нужны системы эффектов
  2. Тип Effect
  3. Композиция эффектов
  4. Каналы ошибок и зависимости
← Назад к TypeScript Academy