Логические литералы и вывод литеральных типов
Разберитесь, как TypeScript расширяет или сужает вывод литеральных типов
«Логические литералы и вывод литеральных типов» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Литеральные типы строк и чисел
- Логические литералы и вывод литеральных типов
- Утверждения const с помощью as const
- Объединение литералов в объединения