Композиция эффектов
Объединяйте эффекты в цепочки с помощью 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 30map: преобразование успешного значения
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 — локальная установка не требуется.
Все уроки этого курса
- Зачем нужны системы эффектов
- Тип Effect
- Композиция эффектов
- Каналы ошибок и зависимости