Что делает оператор 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, он не теряет информацию и не отключает проверки.