TypeScript Academy · Урок

Логические литералы и вывод литеральных типов

Разберитесь, как TypeScript расширяет или сужает вывод литеральных типов

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

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

Логические литеральные типы

Тип boolean фактически представляет собой объединение true | false. Каждый из этих вариантов — логический литеральный тип, то есть тип, разрешающий только одно конкретное логическое значение.

let yes: true = true;
let no: false = false;
console.log(yes, no);
// yes = false; // Error: false not assignable to true

Логические литералы в объединениях

Логические литералы особенно полезны в сочетании с другими литералами для описания различаемых результатов, например флага успешного выполнения вместе с формой данных.

type Result =
  | { ok: true; value: number }
  | { ok: false; error: string };

const r: Result = { ok: true, value: 42 };
console.log(r);

Расширение типов

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

const exact = 'hello'; // type: 'hello' (literal)
let broad = 'hello';   // type: string (widened)
console.log(exact, broad);

Расширение let до общего типа

Поскольку переменной let можно присвоить новое значение, TypeScript выводит общий тип, чтобы разрешить будущие присваивания. Строковая переменная let изначально имеет тип string, а не литеральный тип.

let mood = 'happy'; // inferred as string
mood = 'sad';       // allowed
mood = 'tired';     // allowed
console.log(mood);

const сохраняет литерал

Переменной const нельзя присвоить новое значение, поэтому TypeScript выводит наиболее конкретный тип — литеральный. Поэтому const greeting = 'hi' имеет тип 'hi', а не string.

const greeting = 'hi'; // type: 'hi'

type Greeting = typeof greeting; // 'hi'
const other: Greeting = 'hi';
console.log(other);

Расширение типов для чисел и логических значений

То же правило применяется к числам и логическим значениям. const сохраняет 42 или true как литерал, а let расширяет тип до number или boolean.

const n = 42;   // type: 42
const b = true; // type: true
let m = 42;     // type: number
let c = true;   // type: boolean
console.log(n, b, m, c);

Зачем нужно расширение типов

Расширение типов делает повседневный код удобнее. Если бы каждый фрагмент let count = 0 имел литеральный тип 0, увеличить значение было бы невозможно. Расширение позволяет переменным, которым можно присваивать новые значения, вести себя естественно.

let count = 0; // widened to number
count = count + 1;
count = 10;
console.log('Count:', count);

Как сохранить литерал с помощью аннотации

Иногда нужно, чтобы переменная let сохраняла литеральный тип. Добавьте явную аннотацию литерального типа, и TypeScript сохранит узкий тип, по-прежнему позволяя присваивать значения из этого объединения.

let status: 'on' | 'off' = 'on';
status = 'off'; // allowed
console.log(status);
// status = 'paused'; // Error

Расширение типов в свойствах объектов

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

const config = { mode: 'dark' };
// config.mode has type string, not 'dark'
config.mode = 'light';
console.log(config.mode);

Вывод литеральных типов в функциях

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

function getMode(): 'dark' | 'light' {
  return 'dark';
}

const m = getMode(); // type: 'dark' | 'light'
console.log(m);

Выбор между literal и обобщённым типом

Практическое правило: используйте const или явные аннотации literal-типа, когда нужны точные значения (ключи config, дискриминаторы). Для обычных изменяемых переменных позволяйте типу расширяться. Понимание того, какой вариант получится, помогает избежать неожиданных ошибок совместимости типов.

const KEY = 'apiUrl';     // literal 'apiUrl'
let retries = 3;          // number
let level: 'low' | 'high' = 'low'; // pinned literal
console.log(KEY, retries, level);

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

Проверьте, насколько хорошо Вы поняли расширение типов и вывод literal-типов.

Повторение: вывод literal-типов

Основные выводы:

  • true и false — literal-типы; boolean равно true | false.
  • Изменяемая переменная расширяется до общего типа (string, number, boolean).
  • Константа сохраняет точный literal-тип.
  • Укажите literal-тип, чтобы закрепить изменяемую переменную за узким объединением.

Далее мы явно зададим неизменяемость с помощью as const.

const literal = 'fixed'; // 'fixed'
let widened = 'fixed';   // string
let pinned: 'a' | 'b' = 'a';
console.log(literal, widened, pinned);
Можно начать бесплатно

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

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

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

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

Урок «Логические литералы и вывод литеральных типов» бесплатный?

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

Чему я научусь в уроке «Логические литералы и вывод литеральных типов»?

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

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

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

Сколько времени занимает урок «Логические литералы и вывод литеральных типов»?

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

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

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

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

  1. Литеральные типы строк и чисел
  2. Логические литералы и вывод литеральных типов
  3. Утверждения const с помощью as const
  4. Объединение литералов в объединения
← Назад к TypeScript Academy