Обзор библиотеки types-spring
Улучшенные типы и дополнительные утилиты для разработки на typesctipt вместе с types-spring
765 открытий5К показов
Types-spring — это библиотека надстройка над typescript, улучшающая безопасность и удобство использования встроенных типов.
А для чего?
К сожалению, typeScript не идеален: несмотря на всю его продуманность, он имеет много проблем и недоработок, которые в сообществе годами являются предметами обсуждений , но так и остаются нерешенными. Types-spring ставит перед собой цель нивелировать как можно больше таких недоработок. Это своего рода патч над TypeScript, который расширяет встроенные типы, делая их более точными и полезными для разработчика.
Как это работает?
Мы знаем, что typescript — это довольно гибкий язык [типов], работающий поверх JavaScript. И поскольку JavaScript – язык со слабой динамической типизацией, которой можно крутить как душе угодно, то и типы должны быть настолько гибкими, чтобы их можно было легко адаптировать от проекта к проекту под соответствующую кодовую базу. К счастью, typescript позволяет это сделать: достаточно просто расширить одноименные интерфейсы (declaration merging), избегая конфликтов слияния.
Но предлагаю посмотреть, что же он предлагает:
От слов к делу
Усовершенствованные типы:
Array.map
Сейчас метод .map, примененный к типу кортежа (массиву с фиксированной длинной и позиционно типизированными элементами), возвращает тип обычного массива с неопределенной длиной:
Но куда пропадает длина, ведь метод map не меняет длину исходного массива? С types-spring это выглядит точнее:
Array.isArray
С этим методом связан довольно старый баг. Issue о нем висит еще с 17 года и до сих пор открыта. Пример воспроизведения бага:
По дефолту такой type guard работает неправильно. Но types-spring не позволит ошибке протечь в рантайм:
Object.create
Удивительно, почему разработчики решили покрыть метод create типом any:
Cогласно спецификации даже если мы передадим в качестве прототипа null — на выходе все равно получим объект (правда без прототипа) — ни number, ни boolean, ни что либо иное мы не получим, в принципе. Так же любой typescript-разработчик знает, что any – это очень плохой тип, которого нужно избегать: он может принимать любые формы и чаще всего является просто временной заглушкой. Чтобы это исправить включаем types-spring в свой проект:
Это беглый обзор пакета и не включает описание всех его возможностей. Более подробно с ними можно ознакомиться в официальном readme. Там же можно найти и улучшения встроенных типов DOM. А здесь мы остановимся на другом удивительном инструменте, поставляемом в том же пакете — типах-утилитах.
Utility types
Мы знаем, что typescript поставляется с типами утилитами для быстрого конструирования типов. Однако зачастую сталкиваемся с ситуациями, когда встроенных типов не хватает. Types-spring поставляет с собой некоторые дополнительные типы-утилиты, которые могут быть весьма полезны повседневной разработке. Рассмотрим парочку из них:
OptionalExceptOne
Допустим у нас есть функция, которая принимает в качестве аргумента объект, представляющий собой некоторые опции. Причем нам необходимо, чтобы как минимум одно поле из этого объекта было передано — не важно какое. Для этого мы можем использовать универсальный тип OptionalExceptOne:
ReduceBy
Как часто мы используем reduce для сжатия массива до объекта? Как правило, результат приходится типизировать вручную. Однако зачастую такое “сжатие” происходит по какому-то одному конкретному полю. В этом случае на помощь приходит тип ReduceBy:
На вход он принимает сам кортеж с объектами, а вторым аргументом — одно общее поле для всех объектов этого кортежа, по которому будет сгруппирован объект.
Types-spring содержит больше 20-ти подобных утилит. Все их можно найти в специальном readme для утилит.
Если обзор вам показался полезным, добавляйте в закладки, а для уверенности — поставьте репозиторию звезду на github. Тогда в любой момент сможете найти его у себя во вкладке Stars )
Всем хорошего дня!
765 открытий5К показов