{"id":14291,"url":"\/distributions\/14291\/click?bit=1&hash=257d5375fbb462be671b713a7a4184bd5d4f9c6ce46e0d204104db0e88eadadd","hash":"257d5375fbb462be671b713a7a4184bd5d4f9c6ce46e0d204104db0e88eadadd","title":"\u0420\u0435\u043a\u043b\u0430\u043c\u0430 \u043d\u0430 Ozon \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0442\u0430\u043c \u043d\u0435 \u043f\u0440\u043e\u0434\u0430\u0451\u0442","buttonText":"","imageUuid":""}

TypeScript 4.9 - улучшения операторов satisfies, in и сравнения с NaN

Новая версия TypeScript 4.9 вносит некоторые довольно полезные улучшения в работу с типизацией и операторами. Давайте разберем их подробнее в данной статье и как все это поможет нам в наших проектах.

Гибкая типизация объектов с помощью satisfies

Оператор satisfies в TypeScript предоставляет возможности для гибкой типизации объектов. Он позволяет не ограничивать себя заранее заданными типами, когда мы сами формируем объект.

Рассмотрим на примере:

// Описание структуры ошибки type ErrorInfo = { code: number | string; extra?: Record<string, any>; } // Объект ошибки const error = { code: '404', extra: { requestId: 'abc123' } };

Здесь переменная code может быть числом или строкой, а extra - необязательным объектом.

Предположим, что мы взяли и опечатались в переменной extra:

const error = { code: '404', ekstra: { // Сделали опечатку requestId: 'abc123' } };

Видим в консоли, что TypeScript выдаст нам ошибку, что нет такого свойства как ekstra.

Однако если захотим преобразовать и code , то тоже получим ошибку:

error.code.toUpperCase(); // Выводится ошибка

Вот именно тут к нам на помощь и приходит оператор satisfies:

const error = { // ... } satisfies ErrorInfo;

Теперь объект может быть любым, главное чтобы он соответствовал ErrorInfo.

Таким образом, все это даёт нам большую гибкость в типизации. Теперь не нужно заранее ограничивать объект типом, а достаточно просто указать требования к структуре и затем TypeScript сам проверит соответствие интерфейсу.

Улучшение оператора in

Оператор in теперь позволяет лучше различать типы в условиях:

type A = { a: number, b: number }; type B = { a: number, c: number }; function f(x: A | B) { if ('c' in x) { x; // Тип B } else { x; // Тип A } }

Раньше после проверки in тип все равно оставался A | B . Теперь же можно различить типы по наличию свойств.

Например это может быть особенно полезно при работе с unknown :

function process(data: unknown) { if (typeof data === 'object' && data && 'id' in data) { data.id; // Все работает } }

Сравнение со значением NaN

Теперь TypeScript будет предупреждать об ошибочном сравнении со значением NaN:

let x = NaN; if (x !== NaN) { // Вывод в консоль: ошибка. Используйте Number.isNaN }

Раньше такое сравнение проходило без проблем, но теперь компилятор поможет нам избежать распространенной ошибки и предложит использовать Number.isNaN() .

Выводы

Таким образом, новая TypeScript 4.9 приносит нам ряд новых полезных улучшений как:

- Оператор satisfies, который позволяет гибко типизировать объекты

- Улучшение оператора in для определения типов

- Предупреждение о неправильном использовани и сравнении с NaN

Надеюсь, что вам понравилась данная статья и вы готовы использовать эти новые улучшения в своих проектах. Ставьте лайки и подписывайтесь. Не судите строго, не надо :(

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