{"id":14276,"url":"\/distributions\/14276\/click?bit=1&hash=721b78297d313f451e61a17537482715c74771bae8c8ce438ed30c5ac3bb4196","title":"\u0418\u043d\u0432\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0439 \u0442\u043e\u0432\u0430\u0440 \u0438\u043b\u0438 \u0443\u0441\u043b\u0443\u0433\u0443 \u0431\u0435\u0437 \u0431\u0438\u0440\u0436\u0438","buttonText":"","imageUuid":""}

Небольшой пример использования оператора 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"'`, что нам и требовалось.

0
Комментарии
-3 комментариев
Раскрывать всегда