TypeScript Academy · Урок

Моделирование типов Result

Представляйте успех и сбой как данные с помощью Result

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

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

Тип результата

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

Определение типа результата

В классической форме используется дискриминант ok. Если ok равно true, присутствует value; если false — error.

type Result<T, E> =
  | { ok: true; value: T }
  | { ok: false; error: E };

Вспомогательные конструкторы

Небольшие вспомогательные функции ok и err делают создание результатов кратким и понятным, избавляя от необходимости каждый раз вручную записывать литералы объектов.

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

Возврат результата

Функция, которая может завершиться ошибкой, возвращает ok(value) или err(error). Тип возврата сообщает каждому вызывающему коду об обеих возможностях.

function divide(a: number, b: number): Result<number, string> {
  return b === 0 ? err("divide by zero") : ok(a / b);
}

Сужение типа по ok

Проверка result.ok сужает объединение. В истинной ветви TypeScript знает, что существует value; в ложной ветви он знает, что существует error.

const r = divide(10, 2);
if (r.ok) console.log(r.value); // 5
else console.log(r.error);

Дискриминант обеспечивает безопасность

Поле ok — это дискриминант, который позволяет компилятору выбрать правильную ветвь. Нельзя получить доступ к value, предварительно не доказав, что ok равно true.

const r = divide(1, 0);
// r.value here is a type error until we check r.ok
if (!r.ok) console.log("err:", r.error);

Типизированные ошибки

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

type DivErr = { kind: "zero" } | { kind: "overflow" };
function div(a: number, b: number): Result<number, DivErr> {
  if (b === 0) return err({ kind: "zero" });
  return ok(a / b);
}

Полная обработка ошибок

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

const r = div(1, 0);
if (!r.ok) {
  switch (r.error.kind) {
    case "zero": console.log("no zero"); break;
    case "overflow": console.log("too big"); break;
  }
}

Вспомогательная функция со значением по умолчанию

Иногда нужно просто получить значение или запасной вариант. Небольшая функция unwrapOr делает код понятным и оставляет обработку ошибки в месте её возникновения.

function unwrapOr<T, E>(r: Result<T, E>, fallback: T): T {
  return r.ok ? r.value : fallback;
}
console.log(unwrapOr(divide(1, 0), -1)); // -1

Результат вместо исключения

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

Полный пример

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

function safeParse(s: string): Result<number, string> {
  const n = Number(s);
  return Number.isNaN(n) ? err("NaN") : ok(n);
}
const p = safeParse("42");
console.log(p.ok ? p.value : p.error); // 42

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

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

Итоги

Результат<T, E> — это дискриминируемое объединение { ok: true; value } или { ok: false; error }. Создавайте его с помощью вспомогательных функций ok/err и сужайте тип по ok, чтобы безопасно обращаться к value или error. Типизированные ошибки позволяют обеспечить полную обработку всех вариантов.

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

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

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

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

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

Урок «Моделирование типов Result» бесплатный?

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

Чему я научусь в уроке «Моделирование типов Result»?

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

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

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

Сколько времени занимает урок «Моделирование типов Result»?

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

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

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

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

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