Рецепты TypeScript

Рецензия на книгу Стефана Баумгартнера "Рецепты TypeScript. Программирование на уровне типов для реальных задач"

Рецепты TypeScript. Программирование на уровне типов для реальных задач. Стефан Баумгартнер. Перевод на русский язык “Спринт Бук”, 2024.

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

Про автора книги известно, что это программный архитектор из Австрии, специализирующийся на языках TypeScript и Rust. У него есть свой блог https://oida.dev/

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

Несмотря на самодостаточность отдельных рецептов, книга хорошо подходит для режима чтения “от корки до корки”. Главы организованы по нарастанию сложности. В более поздних главах используются возможности языка, которые были объяснены в более ранних главах. Это делает книгу не только справочником, но и хорошим учебником языка (но не для первого знакомства).

Книга содержит более сотни рецептов, сгруппированных в 12 глав. Далее я перечислю лишь то, что привлекло мое внимание в каждой из них.

1. настройка проекта

Здесь рассказывается об отдельных настройках в файле конфигурации TypeScript. На мой субъективный взгляд, не самая удачная глава. Я из нее мало что вынес.

2. основные типы

Объясняется, например, разница между типами Object, object и {}. Рассказывается, как создать декларацию типа объекта, на который ссылается this в функции. Начиная с этой главы, плотно идет полезная информация. Книга начинает нравиться.

3. система типов

Приводятся примеры использования помеченных объединений и optional never; сигнатур индекса и сопоставленных типов; проверки исчерпания случаев с помощью assertNever. Также приведен прием пересечения строки с пустым объектом string & {} для достижения читаемости подсказок IDE.

4. обобщенные типы

Рассказано о сигнатурах assert для сужения типов. Приведен пример использования неочевидного типа ThisType<T>. Приведен пример использования as const с параметрами обобщенного типа, для предотвращения чрезмерного расширения типов объектов.

5. условные типы

Описано использование условных типов вместе с перегрузкой сигнатур функций для типизации сложных сигнатур; использование never в условных типах; распределительные условные типы. Приведено полезное применение Extract<T, U>. Описан прием использования never на левой стороне (т.е. стороне ключа, а не значения) при создании декларации типа объекта с частично удаленными ключами. Описано применения ключевого слова infer в условных типах.

6. типы литералов шаблонов строк

Описано использование типов литералов шаблонов строк с условными типами и с infer. Здесь рецепты становятся довольно сложными и достигают уровня “программирования на типах”.

7. вариативные типы кортежей

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

8. вспомогательные типы

Рассказано про полезный вспомогательный тип Remap, который делает подсказки IDE более читаемыми.

9. стандартная библиотека и определения внешних типов

Рассказано, как решить проблемы, которые возникают в коде на TypeScript при работе со стандартными функциями JavaScript. Например, при доступе к свойствам объекта во время итерации по ключам. Описана работа с fetch.

10. TypeScript и React

Эту главу я пропустил, так как не являюсь пользователем React.

11. классы

Приведены примеры проблем, которые встречаются в проектах, написанных в объектно ориентированной парадигме на классах, с использованием паттернов ООП.

12. стратегии разработки типов

Приведен алгоритм действий разработчика при написании типов. От простого к сложному. От общего к частному. Автор дает совет не привносить ненужную сложность и использовать описанные в книге возможности TypeScript только при необходимости.

Вывод

Книга насыщена полезными фактами и примерами решения проблем. Она объясняет сложные возможности TypeScript, учит их применять. Общее впечатление от книги следующее - её интересно было прочитать “от корки до корки” и её хочется держать под рукой, чтобы обращаться к ней как к справочнику во время работы.