PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые типы

Что делает оператор satisfies в TypeScript и когда он нужен?

Продвинутые типы

`satisfies` проверяет, что значение соответствует типу, но не расширяет вычисленный тип выражения до этого типа. Вы получаете проверку на ошибки и сохраняете точные, узкие типы.

Проблема с аннотацией

type Colors = Record<string, string | number[]>;

const palette: Colors = { red: [255, 0, 0], green: '#00ff00' };
palette.red.map((n) => n); // ошибка: red может быть string

Аннотация «забывает» точный тип каждого свойства.

Решение

const palette = {
  red: [255, 0, 0],
  green: '#00ff00',
} satisfies Colors;

palette.red.map((n) => n * 2); // number[]
palette.green.toUpperCase();    // string
// palette.blue = 1;            // ошибка: лишнее свойство не проверяется,
//                              // но и такого поля в типе нет

Неподходящее значение (а при ключах-литералах и опечатка в ключе) будет поймано при объявлении, а типы свойств останутся точными.

satisfies и as

  • as заставляет компилятор поверить вам и может скрыть ошибку.
  • satisfies ничего не приводит — только проверяет.

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

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

Коротко для собеседования

satisfies проверяет соответствие типу без расширения типа выражения: ошибки ловятся, а выведенный тип остаётся узким. В отличие от аннотации и as, он не теряет информацию и не отключает проверки.

Другие вопросы раздела