0Pricing
TypeScript Academy · Урок

Зачем нужен satisfies

Поймите, как satisfies устраняет разрыв между аннотацией и выводом типов

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

Две противоречащие друг другу цели

Когда Вы объявляете config, обычно нужны две вещи: проверка на соответствие известной структуре и точное выведение типов литеральных значений. Эти цели часто противоречат друг другу.

type Color = "red" | "green" | "blue";
// We want both: check the values AND remember exactly which ones.

Аннотация отменяет сужение литеральных типов

Добавление аннотации типа проверяет объект, но расширяет типы значений. Компилятор забывает точные литералы, которые Вы записали.

type Config = { color: string; retries: number };
const cfg: Config = { color: "red", retries: 3 };
// cfg.color is string, not "red" anymore.
console.log(cfg.color.toUpperCase());

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

Если color расширен до string, Вы теряете возможность использовать его там, где требуется конкретный литерал, например для индексации другого типа.

const cfg = { color: "red" } as { color: string };
// const exact: "red" = cfg.color; // Error: string not assignable to "red"
console.log(cfg.color);

Без аннотации теряется проверка

Отказ от аннотации сохраняет точное выведение типов, но убирает защиту. Опечатки и неправильные структуры остаются незамеченными.

const cfg = { color: "rad", retries: 3 };
// No error on the typo "rad" because nothing validates it.
console.log(cfg.color);

Пробел в проверке

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

const palette = { primary: "blu" }; // typo, no error
console.log(palette.primary); // "blu"

Оператор satisfies

Оператор satisfies проверяет выражение на соответствие типу, одновременно сохраняя точно выведенный тип. Это лучшее из двух подходов.

type Config = { color: string; retries: number };
const cfg = { color: "red", retries: 3 } satisfies Config;
console.log(cfg.color); // type is "red", value validated

satisfies сохраняет литералы

После применения satisfies значение cfg.color по-прежнему является литералом "red", а не широким типом string. Выведение типа сохраняется.

type Config = { color: string };
const cfg = { color: "red" } satisfies Config;
const exact: "red" = cfg.color; // OK
console.log(exact);

satisfies по-прежнему проверяет

Если объект не соответствует типу, satisfies сообщает об ошибке, так же как аннотация.

type Config = { retries: number };
// const bad = { retries: "three" } satisfies Config; // Error
const good = { retries: 3 } satisfies Config;
console.log(good.retries);

Пример, послуживший мотивацией

Рассмотрим карту маршрутов, где ключи должны быть известными маршрутами, а значения — именами обработчиков. Нам нужны автодополнение ключей AND проверка значений, и satisfies это обеспечивает.

type Routes = Record<string, { method: "GET" | "POST" }>;
const routes = {
  home: { method: "GET" },
  submit: { method: "POST" }
} satisfies Routes;
console.log(routes.home.method); // "GET" literal

Сравнение трёх подходов

Аннотация: проверяет и расширяет типы. Без аннотации: сохраняет точность, но не проверяет. satisfies: проверяет и сохраняет точность. Для конфигураций третий подход лучше.

type C = { color: string };
const a: C = { color: "red" };          // widened
const b = { color: "red" };             // unvalidated
const c = { color: "red" } satisfies C; // validated + precise
console.log(a.color, b.color, c.color);

Когда следует использовать satisfies

Используйте satisfies всякий раз, когда определяете константное значение, которое должно соответствовать типу, но позже хотите обращаться к его точному содержимому.

type Sizes = Record<string, number>;
const sizes = { sm: 8, md: 16, lg: 24 } satisfies Sizes;
// keys "sm" | "md" | "lg" stay known for autocomplete
console.log(sizes.md);

Быстрая проверка: зачем нужен satisfies

Проверьте, понимаете ли Вы, зачем нужен satisfies.

Итоги: зачем нужен satisfies

Вы узнали, что аннотации проверяют, но расширяют типы, отсутствие аннотации сохраняет точность, но не выполняет проверку, а satisfies объединяет проверку и точное выведение типов — это идеальный вариант для объектов конфигурации.

type C = { color: string };
const c = { color: "blue" } satisfies C;
const exact: "blue" = c.color;
console.log(exact);

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

Урок «Зачем нужен satisfies» бесплатный?

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

Чему я научусь в уроке «Зачем нужен satisfies»?

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

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

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

Сколько времени занимает урок «Зачем нужен satisfies»?

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

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

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

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

  1. Зачем нужен satisfies
  2. satisfies и аннотация типа
  3. satisfies и утверждение as
  4. Практические шаблоны satisfies
← Назад к TypeScript Academy