Небольшой пример использования оператора satisfies в TypeScript

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

У нас есть список продуктов `listA` и нужно подготовить объект, ключи которого были бы произвольными строками, а значениями - любое из входящих в список.

const listA = ['apples', 'oranges', 'peaches'] as const; type ListA = (typeof listA)[number]; // "apples" | "oranges" | "peaches" const listMap1: Record<string, ListA> = { a: 'apples', b: 'oranges', c: 'peaches', d: 'apples', };

Если мы попытаемся указать значение не из списка, например `carrot`, то получим предупреждение, что и требовалось.

Теперь нам нужно из объекта `listMap1` вывести тип ключей, входящих в него. И здесь возникает проблема, так как в самом начале мы определили его тип как `Record<string, ListA>`. То есть ключ - это любая строка:

type Key1 = keyof typeof listMap1; const keyOne: Key1 = 'Y'; // const keyOne: string

Мы не получим ошибки, хотя должны были бы. Здесь и пригождается оператор `satisfies`, который указывает TS, что мы не определяем тип переменной, но просто ожидаем, что в ключах будут строки, а в значениях что-то из списка фруктов.

const listMap2 = { a: 'apples', b: 'oranges', c: 'peaches', d: 'apples', } satisfies Record<string, ListA>;

В этом случае приведенный раннее код будет работать как и положено:

type Key2 = keyof typeof listMap2; const keyTwo: Key2 = 'Y'; // const keyTwo: "a" | "b" | "c" | "d"

мы получим ошибку `Type '"Y"' is not assignable to type '"a" | "b" | "c" | "d"'`, что нам и требовалось.

Начать дискуссию