Механика расширения и сужения типов
Узнайте, как TypeScript расширяет типы и когда это предотвращать
«Механика расширения и сужения типов» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.
Что такое расширение типа?
Расширение типа происходит, когда TypeScript выводит более широкий тип, чем тот, который Вы указали. При присваивании let x = "hello" тип расширяется до string, а не остаётся литеральным типом "hello".
let x = "hello"; // inferred: string, not "hello"
let y = 42; // inferred: number, not 42Расширение типов с let и const
Переменные, объявленные с помощью const, сохраняют литеральный тип, поскольку их нельзя переназначить. Тип let расширяется до базового типа.
const a = "world"; // type: "world"
let b = "world"; // type: stringПредотвращение расширения с помощью аннотаций типов
Явная аннотация переменной let предотвращает расширение и фиксирует литеральный тип.
let direction: "left" | "right" = "left";
// direction = "up"; // Error: not assignableСужение с помощью typeof
TypeScript сужает тип объединения внутри проверок typeof, предоставляя точный тип в соответствующей ветви.
function format(val: string | number) {
if (typeof val === "string") {
return val.toUpperCase(); // val: string here
}
return val.toFixed(2); // val: number here
}Сужение с помощью проверок равенства
Проверки равенства с литеральными значениями также сужают тип внутри ветви.
type Direction = "left" | "right" | "up";
function handle(dir: Direction) {
if (dir === "left") {
console.log("Going left"); // dir: "left"
}
}Анализ потока управления
TypeScript отслеживает присваивания в потоке управления и сужает тип после каждой ветви.
function process(x: string | null) {
if (x === null) return;
// x is string here — TypeScript knows null is ruled out
console.log(x.length);
}Расширение типов в литералах объектов
Значения свойств в литералах объектов также расширяются, если не использовать as const.
const config = { mode: "dark" };
// config.mode: string (widened)
const config2 = { mode: "dark" } as const;
// config2.mode: "dark" (literal)Свежесть и расширение типов
При непосредственном присваивании литерала объекта переменной с заданным типом TypeScript выполняет проверку лишних свойств, но после расширения объекта до именованной переменной эта проверка больше не применяется.
interface Options { timeout: number; }
const opts = { timeout: 3000, retry: true };
// No error — widened type, excess property check skipped
const o: Options = opts;Сужение с помощью оператора in
Оператор in сужает типы объединения объектов, проверяя наличие свойства.
type Cat = { meow(): void };
type Dog = { bark(): void };
function speak(animal: Cat | Dog) {
if ("meow" in animal) animal.meow();
else animal.bark();
}Сужение с помощью функций утверждений
Функции утверждений используют возвращаемые типы asserts condition, чтобы сужать тип после вызова.
function assertString(val: unknown): asserts val is string {
if (typeof val !== "string") throw new Error("Expected string");
}
const x: unknown = "hi";
assertString(x);
x.toUpperCase(); // OK — narrowed to stringИтоги: расширение и сужение типов
Расширение делает выведенные типы более общими для большей гибкости, а сужение уточняет широкий тип до конкретного внутри условной ветви. Понимание обоих механизмов помогает писать более безопасный код на TypeScript.
Быстрая проверка
Какое объявление предотвращает расширение до базового типа?
Что Вы узнали
Теперь Вы понимаете расширение типов — то, как TypeScript делает выведенные типы более общими, — и сужение типов — то, как условные проверки создают точные типы. Используйте as const, чтобы предотвращать расширение, и проверки потока управления, чтобы безопасно сужать объединения.
Изучай TypeScript с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 101
- Уроки
- 352
Часто задаваемые вопросы
Урок «Механика расширения и сужения типов» бесплатный?
Да — полный текст урока «Механика расширения и сужения типов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «Механика расширения и сужения типов»?
Узнайте, как TypeScript расширяет типы и когда это предотвращать Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Механика расширения и сужения типов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Механика расширения и сужения типов
- Контекстная типизация: вывод из контекста
- Свежесть и проверка лишних свойств
- Утверждения const и as const