TypeScript Academy · Урок

Программирование в стиле Railway

Объединяйте операции, которые могут завершиться сбоем, без try/catch

Урок 4 из 413 шагов

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

Метафора железной дороги

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

Объединение функций результата в цепочку

Каждый шаг принимает значение и возвращает Result. Нужно соединить шаги так, чтобы первая ошибка прерывала цепочку и передавалась до самого конца.

type Result<T, E> = { ok: true; value: T } | { ok: false; error: E };
const ok = <T>(value: T): Result<T, never> => ({ ok: true, value });
const err = <E>(error: E): Result<never, E> => ({ ok: false, error });

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

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

function map<T, U, E>(r: Result<T, E>, f: (t: T) => U): Result<U, E> {
  return r.ok ? ok(f(r.value)) : r;
}
console.log(map(ok(2), n => n + 1)); // { ok: true, value: 3 }

flatMap: объединение шагов, которые могут завершиться ошибкой

Если следующий шаг сам возвращает результат, используйте flatMap (также называемый andThen). Это позволяет избежать вложенных результатов и прерывает цепочку при ошибке.

function flatMap<T, U, E>(r: Result<T, E>, f: (t: T) => Result<U, E>): Result<U, E> {
  return r.ok ? f(r.value) : r;
}

Почему flatMap, а не map

Если применить map к функции, возвращающей результат, получится Result<Result<U,E>,E>. flatMap распрямляет один уровень вложенности, сохраняя один результат.

Прерывание при первой ошибке

Как только шаг возвращает err, каждый последующий вызов flatMap передаёт его дальше без изменений. Оставшиеся шаги никогда не выполняются — совсем как при переходе на путь ошибки.

const start = err("boom") as Result<number, string>;
const out = flatMap(start, n => ok(n + 1));
console.log(out); // { ok: false, error: "boom" }

Построение конвейера

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

function parseNum(s: string): Result<number, string> {
  const n = Number(s);
  return Number.isNaN(n) ? err("not a number") : ok(n);
}
function positive(n: number): Result<number, string> {
  return n > 0 ? ok(n) : err("must be positive");
}

Запуск конвейера

Цепочка вызовов flatMap передаёт значение через каждый шаг, который может завершиться ошибкой. Любая ошибка останавливает цепочку и сообщает о себе.

const good = flatMap(parseNum("5"), positive);
console.log(good); // { ok: true, value: 5 }
const bad = flatMap(parseNum("-3"), positive);
console.log(bad); // { ok: false, error: "must be positive" }

Сочетание map и flatMap

Используйте flatMap для шагов, которые могут завершиться ошибкой, а map — для чистых преобразований. Вместе они сохраняют линейность основного успешного пути, а ошибки обрабатываются автоматически.

const result = map(flatMap(parseNum("10"), positive), n => n * 2);
console.log(result); // { ok: true, value: 20 }

Перехват исключений не требуется

Весь конвейер выражает успех и ошибку через значения. Конструкция try/catch не нужна, а тип каждого шага делает путь ошибки явным и неизбежным для обработки.

Почему это хорошо масштабируется

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

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

Быстрая проверка по этому уроку.

Итоги

Программирование в стиле железной дороги объединяет в цепочку шаги, возвращающие Result, используя map (преобразование успеха) и flatMap/andThen (объединение шагов, которые могут завершиться ошибкой, с распрямлением вложенных результатов). Первая ошибка err прерывает оставшуюся цепочку и передаётся до конца без try/catch.

Можно начать бесплатно

Изучай TypeScript с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
101
Уроки
352

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

Урок «Программирование в стиле Railway» бесплатный?

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

Чему я научусь в уроке «Программирование в стиле Railway»?

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

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

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

Сколько времени занимает урок «Программирование в стиле Railway»?

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

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

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

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

  1. Проблема выбрасывания ошибок
  2. Моделирование типов Result
  3. Типы Option и Maybe
  4. Программирование в стиле Railway
← Назад к TypeScript Academy