Моделирование типов Result
Представляйте успех и сбой как данные с помощью Result
«Моделирование типов 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 — локальная установка не требуется.
Все уроки этого курса
- Проблема выбрасывания ошибок
- Моделирование типов Result
- Типы Option и Maybe
- Программирование в стиле Railway