Оператор «удовлетворяет» в TypeScript

Подтвердить, что тип выражения соответствует некоторому типу, не изменяя результирующий тип этого выражения.

TypeScript 4.9 удовлетворяет

В версии 4.9 TypeScript представляет новый оператор, который называется «удовлетворяет». Его цель — сделать неоднородные наборы типов более гибкими, позволяя объединению типов удовлетворять общему типу.

Исправить ошибку типа с помощью Record<>

Лучший пример для демонстрации этого нового оператора использует тип «Запись», где типы значений могут различаться.

type Keys = "alpha" | "beta" | "gamma";

const variants = {
  alpha: 0,
  beta: 1,
  gamma: "three"
} satisfies Record<Keys, string | number>;

// With the new 'satisfies'-operator,
// the types for each of the properties
// is correctly inferred.
const otherBeta = variants.beta + 10;
const gammeUppercase = variants.gamma.toUpperCase();

Как видите, новый код позволяет правильно определить допустимый тип для данного ключа. Это было бы невозможно до TypeScript 4.9. Компилятор будет жаловаться, что значение может быть строкового или числового типа, тогда как теперь компилятор правильно определяет конкретный тип.

Ограничение имени свойства

Мы также можем использовать оператор new, чтобы указать компилятору, что набор может включать только некоторые заданные ключи, но не принимать никакие другие.

type Keys = "alpha" | "beta" | "gamma";

const variants = {
    alpha: "value",
    beta: 0,
    // The compiler will show an error,
    // as 'delta' is not part of the keys.
    delta: new Date()
} satisfies Partial<Record<Keys, unknown>>;

Другие примеры

Для получения полного списка примеров с подробным описанием я настоятельно рекомендую исходный выпуск этой функции на Github, где автор описывает множество вариантов использования (ссылка также в приложении).