Зачем нужен 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 validatedsatisfies сохраняет литералы
После применения 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 — локальная установка не требуется.
Все уроки этого курса
- Зачем нужен satisfies
- satisfies и аннотация типа
- satisfies и утверждение as
- Практические шаблоны satisfies