Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
Способен ли TypeScript устранить проблемы, которыми так знаменит JavaScript? Да, но его изучение потребует определенных усилий, времени и практики. 83 правила позволят ускорить и облегчить знакомство с TypeScript. Каждое правило — это конкретная рекомендация, рассказывающая на примерах что можно и чего нельзя делать в TypeScript и как грамотно работать с этим языком. Эта книга поможет подняться с уровня начинающего или среднего пользователя, знакомого с основами TypeScript, на уровень TS-эксперта, который может профессионально работать с этим языком. Второе издание было обновлено для TypeScript 5, и включает две новые главы, посвященные программированию на уровне типов и рецептам TypeScript.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 507
Veröffentlichungsjahr: 2025
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Переводчики Е. Матвеев, Е. Матвеев
Дэн Вандеркам
Эффективный TypeScript: 83 способа улучшить код. 2-е изд. . — Астана: "Спринт Бук", 2025.
ISBN 978-601-08-4572-5
© ТОО "Спринт Бук", 2025
Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.
«В книге “Эффективный TypeScript” автор рассматривает распространенные проблемы, с которыми мы сталкиваемся при работе с TypeScript, и дает практические советы, ориентированные на достижение результата. Книга пригодится и опытным, и начинающим разработчикам».
Райан Кавано, ведущий инженер по TypeScript в Microsoft
«Второе издание “Эффективного TypeScript” — отличное дополнение к и без того превосходной книге. Практичные советы из первого издания сочетаются в нем с рекомендациями по лучшим практикам TypeScript. Приведенная информация крайне необходима для работы с TypeScript в проектах любого размера. Мне особенно понравилось, что во многих рекомендациях описаны нюансы того, когда и почему они должны применяться. Советую каждому разработчику, кто хочет глубоко освоить написание кода TypeScript, перечитать эту книгу не один раз и делать подробные заметки».
Джош Голдберг, участник сообщества разработки с открытым кодом, автор книги «Learning TypeScript»
«“Эффективный TypeScript” — не просто руководство по одному из самых популярных языков программирования в мире. Книга научит вас мыслить категориями типов, дополняя это практическими советами по их применению. Опыт Дэна проявляется на каждой странице. Эта книга для сильных духом! И она может изменить ваши представления о программировании за пределами TypeScript».
Стефан Баумгартнер, старший архитектор продукта, Dynatrace, автор книги «TypeScript Cookbook»1
«Второе издание “Эффективного TypeScript” — превосходная книга для инженеров, которые уже знакомы с азами TypeScript, пишут на нем в рамках своей повседневной работы или размышляют о миграции на TypeScript своей кодовой базы».
Борис Черный, автор книги «Programming TypeScript»2
«Я работала с TypeScript более 10 лет как в области преподавания, так и в профессиональной практике. “Эффективный TypeScript” предлагает дельные советы, которые хорошо согласуются с моим опытом. Книга убедительно показывает, что понимание синтаксиса TypeScript — одно, а умение пользоваться его возможностями — совсем другое. Это полезное руководство для тех, кто знаком с TypeScript, но хочет научиться использовать его возможности на новом уровне».
Титиан-Корнел Черникова-Драгомир, разработчик из Bloomberg LP
«“Эффективный TypeScript” содержит практические рецепты: эта книга должна быть под рукой у каждого профессионального разработчика. Даже если вы думаете, что знаете TypeScript, купите эту книгу — не пожалеете».
Яков Файн, Java-чемпион
«Эта книга не только о том, что может делать TypeScript, но и о том, почему полезна отдельно взятая функция и где применять шаблоны для достижения наибольшего эффекта. Книга фокусируется на практических советах, которые будут полезны в повседневной работе. При этом в ней достаточно теории, чтобы читатель на глубинном уровне понял, как все работает. Я считаю себя опытным пользователем TypeScript, но узнал из нее много нового».
Джесси Халлетт, сеньор инженер-разработчик, Hasura
1 Баумгартнер С. «Рецепты Typescript». СПб., издательство «Питер».
2 Черный Б. «Профессиональный TypeScript». СПб., издательство «Питер».
Посвящается Алекс.
Ты — мой идеал.
Вопреки моим надеждам, работа над вторым изданием была не проще и не быстрее, чем над первым. При этом книга увеличилась с 62 правил до 83. Кроме написания 22 новых правил (одно старое правило было интегрировано с другим), я проанализировал и тщательно пересмотрел весь исходный материал. Некоторые части, например правила 45 и 55, были практически полностью переписаны.
Многие новые правила основаны на материале, который впервые был опубликован в блоге «Effective TypeScript» (https://effectivetypescript.com), хотя все они сильно переработаны.
Глава 6 в основном написана по моему личному опыту построения библиотек crosswalk (https://oreil.ly/-XQ6A) и crudely-typed (https://oreil.ly/E7_gV) для Delve в Sidewalk Labs.
Кратко перечислю источники правил для второго издания.
• Правило 28 адаптировано по материалам поста в блоге «Use Classes and Currying to Create New Inference Sites» («Использование классов и каррирования для создания новых точек вывода типов») (https://oreil.ly/OAApn).
• Правило 32 возникло в результате ряда код-ревью. Я и не знал, что это правило, пока не увидел, как оно нарушается.
• Правило 36 возникло из обратной связи, которую я предоставлял по бесчисленным код-ревью.
• Правило 37 основано на личном опыте и посте «Why Not Add an Option for That» («Почему бы не добавить для этого опцию?») в блоге Эвана Мартина (Evan Martin) (https://oreil.ly/YJWQR). Твиты Кори Хауза (Cory House) по этой теме помогли мне набраться храбрости для включения материала в книгу.
• Правило 38 вдохновлено цитатой Алана Перлиса (Alan Perlis), которую я часто привожу, а также правилом Скотта Мейерса.
• Правило 39 основано на опыте работы моей команды с адаптером Jsonify, который мы с большой радостью приняли и от которого потом с еще большей радостью избавились. Этот опыт привел к появлению поста «The Trouble with Jsonify: Unify Types Instead of Modeling Small Differences» («Проблемы с Jsonify: объединяйте типы вместо моделирования мелких различий») (https://oreil.ly/zVod4).
• Правило 48 адаптировано по материалам поста «The Seven Sources of Unsoundness in TypeScript» («Семь источников ненадежности в TypeScript») (https://oreil.ly/NiTnr) со значительным творческим участием Райана Кавано (Ryan Cavanaugh).
• Правило 50 появилось в результате размышлений относительно того, что собой представляют типы, и благодаря ответу с объяснением зависимых типов на Stack Overflow.
• Правило 51 представляет собой адаптацию поста «The Golden Rule of Generics» («Золотое правило обобщений») (https://oreil.ly/yaxs8), которое, в свою очередь, является адаптированной версией совета из учебника TypeScript.
• Правило 53 вдохновлено моей работой над crosswalk и crudely-typed, а также моим любопытством по поводу всех оберток [T], которые я видел.
• В основу правила 54 легли мои исследования типов шаблонных литералов после выхода TypeScript 4.1, приведших к появлению поста «TypeScript Splits the Atom!» («TypeScript расщепляет атом!») (https://oreil.ly/Es6Ep).
• Правило 56 стало результатом моего длительного интереса к этой теме. Все началось с ответа Титиан Черниковой-Драгомир на вопрос о типизации _.invert на Stack Overflow, за ним последовали мои выводы по работе над crosswalk и crudely-typed, и все в итоге завершилось постом «The Display of Types» («Представление типов») (https://oreil.ly/bue9Q).
• Правило 57 вдохновлено примечаниями к релизу TypeScript 4.5, в котором добавилась хвостовая рекурсия.
• Правило 58 основано на моем опыте связывания TypeScript с базами данных, что в итоге привело меня к докладу на Конгрессе TypeScript 2022 года: «TypeScript and SQL: Six Ways to Bridge the Divide» («TypeScript и SQL: шесть способов преодоления разрыва») (https://oreil.ly/ofuph).
• В правиле 589 представлен трюк, с которым меня познакомил Джесси Халлен (Jesse Hallett) во время рецензирования первого издания. Разновидность с парами была предложена в твите Тома Хикса (Tom Hicks) от 2021 года.
• Правило 62 вдохновлено постом в блоге Artsy: «“Conditional Types in TypeScript» («Условные типы в TypeScript») (https://oreil.ly/r-7E0).
• Правило 63 возникло из обратной связи по первому изданию, полученной от Райана Кавано, которую я в итоге преобразовал в пост в блоге: «Exclusive Or and the Optional never Trick» («Исключающее ИЛИ, или прием с опциональным never») (https://oreil.ly/os01S). Энтузиазм Штефана Баумгартнера (Stefan Baumgartner) по поводу этого приема в книге «TypeScript Cookbook» (O'Reilly) заставил меня включить его описание в свою книгу.
• Правило 71 вдохновлено дискуссией с Эваном Мартином на Reddit и неприятной ошибкой, прокравшейся в newSet("string"). Она привела к посту в блоге «In Defense of Interface: Using Declaration Merging to Disable “Bad Parts”» («В защиту интерфейсов: использование слияния объявлений для отключения “нежелательных частей”») (https://oreil.ly/iYGLY).
• Тема правила 74 встречается достаточно часто, особенно у тех, у кого еще не сформировалась правильная ментальная модель TypeScript.
• Правило 76 появилось из-за бесчисленных сеансов отладки, причиной которых послужили неправильные модели среды.
• Правило 77 вдохновлено моим личным интересом к теме, несколькими вопросами на Stack Overflow и беседой с Гэри Бернхардтом (Gary Bernhardt).
• Правило 78 основано на личном неприятном опыте с замедлением работы TypeScript. Материал был основан на вики TypeScript и посте в блоге «What's Typescript Compiling? Use a Treemap to Find Out» («Что компилирует TypeScript? Древовидная карта поможет вам узнать это») (https://oreil.ly/QRilV).
Спасибо моим научным редакторам: Джошу Голдбергу, Штефану Баумгартнеру, Райану Кавано, Борису Черному и Титиан Черниковой-Драгомир. Полученная от вас обратная связь сделала эту книгу неизмеримо лучше. Спасибо моим коллегам в группе опыта взаимодействия Delve (особенно Стефани Чу (Stephanie Chew), Люде Жао (Luda Zhao), Ха Ву (Ha Vu) и Аманде Морер (Amanda Meurer)) за все рецензирование кода и за то, что они поддержали мой безграничный энтузиазм по отношению к TypeScript. Спасибо всем работникам O'Reilly, благодаря которым появилась эта книга: Анджеле Руфино (Angela Rufino), Эшли Стасси (Ashley Stussy), Аманде Куинн (Amanda Quinn), Клэр Лейлок (Clare Laylock), Соне Саруба (Sonia Saruba). Спасибо Крису Мишайкову (Chris Mischaikow) за последнюю вычитку. Плейлист Jazzy Morning на Spotify, начиная с «Beautiful Sunrise» от Arta Porting, помогал мне в написании и редактировании.
Наконец, спасибо Алекс за всю ее поддержку: во время пандемии, на свадьбе, при смене работы и большом переезде. Я рад, что хоть что-то остается неизменным!
Весной 2016 года я навестил своего бывшего коллегу Эвана Мартина, работавшего в офисе Google в Сан-Франциско, и поинтересовался, чем он сейчас занимается. Этот вопрос я задавал ему в разные годы и постоянно получал новые, неожиданные, но каждый раз очень интересные ответы. Он рассказывал об инструментах создания C++, аудиодрайверах Linux, скриптах для Emacs и онлайн-кроссвордах. На этот раз Эван занялся TypeScript и Visual Studio Code.
Он меня удивил. Я слышал о TypeScript, но знал только, что это разработка Microsoft, ошибочно думая, что она имеет какое-то отношение к .NET. Я не мог поверить, что Эван, который всю жизнь пользовался Linux, вдруг оценил Microsoft.
Затем он показал мне VS Code и песочницу TypeScript в деле, и я сразу же оценил происходящее: все работало очень быстро, а инструменты анализа кода легко выстраивали модель системы типов. Я много лет аннотировал типы в комментариях JSDoc для Closure Compiler и воспринял TS как реально работающий типизированный JavaScript. Неужели Microsoft разработала кросс-платформенный текстовый редактор на платформе Chromium? Возможно, этот язык с его набором инструментов действительно достоин изучения.
Я не так давно присоединился к Sidewalk Labs и начал писать первый JavaScript-проект. Кодовая база была достаточно мала, и мы с Эваном смогли конвертировать его в TypeScript всего за несколько дней.
Тогда-то TypeScript меня и зацепил. Он представляет собой не просто систему типов, а целый набор языковых сервисов, удобных в использовании. Поэтому он не только повышает безопасность разработки в JavaScript, но и делает работу увлекательнее.
Бруклин, Нью-Йорк, октябрь 2019 г.
Эта книга появилась благодаря многим людям. Спасибо Эвану Мартину за подробное знакомство с TypeScript. Доуи Осинге (Douwe Osinga) — за представление меня издательству O'Reilly и поддержку в проекте. Бретту Слаткину (Brett Slatkin) — за советы по структуре и подсказку, что среди моих знакомых есть автор «эффективной» книги. Скотту Мейерсу — за внедрение этого формата и за его полезный пост «Effective Books» («Эффективные книги») в блоге.
Моим научным редакторам: Рику Баттлайну (Rick Battagline), Райану Кавано, Борису Черному, Якову Файну (Yakov Fain), Джейсону Киллиану (Jason Killian) и Джесси Халлету. Всем моим коллегам в Sidewalk, изучавшим TypeScript со мной все эти годы. Всем сотрудникам O'Reilly, участвовавшим в создании книги: Анджеле Руфино, Дженнифер Поллок (Jennifer Pollock), Деборе Бейкер (Deborah Baker), Нику Адамсу (Nick Adams) и Джасмин Квитин (Jasmine Kwityn). Команде TypeScript NYC: Джейсону, Орте и Кириллу, а также всем спикерам. Многие правила появились благодаря обсуждениям на митапе:
• Правило 3 вдохновлено сообщением в блоге Эвана Мартина, которое показалось мне особенно содержательным, когда я только приступил к изучению TypeScript.
• Правило 7 вдохновлено докладом Андерса о структурной типизации и отношениях keyof на конференции TSConf 2018, а также докладом Джесси Халлета на TypeScript NYC Meetup в апреле 2019 года.
• Наставления Басарата (Basarat) и полезные ответы DeeV и GPicazo на сайте Stack Overflow сыграли важнейшую роль при написании правила 9.
• Правило 10 основано на аналогичном совете из правила 4 книги «Effective JavaScript».
• Я решил написать правило 11 после всеобщей путаницы по этой теме на митапе TypeScript NYC в августе 2019 года.
• Правилу 13 сильно помогли вопросы о сравнениях типов с интерфейсами на сайте Stack Overflow. Джесси Халлет предложил формулировку, основанную на расширяемости.
• Джекоб Баскин (Jacob Baskin) предоставил содействие и раннюю обратную связь по правилу 15.
• Правило 18 основано на нескольких примерах кода, опубликованных в ветке Reddit r/typescript.
• Правило 24 базировалось на моей собственной статье для Medium и материалах доклада, с которым я выступил на митапе TypeScript NYC в октябре 2019 года.
• Правило 29 основано на популярной рекомендации в Haskell («Сделайте недопустимые состояния не имеющими представления»). История о рейсе Air France 447 написана по материалам замечательной статьи Джеффа Уайза (Jeff Wise) в «Popular Mechanics» за 2011 год.
• Правило 30 описывает проблему, с которой я столкнулся при работе с объявлениями типов Mapbox. Джейсон Киллиан предложил формулировку в названии.
• Рекомендации по выбору имен в правиле 41 широко известны, но эта конкретная формулировка была вдохновлена короткой статьей Дэна Норта в книге «97 Things Every Programmer Should Know» (Kevlin, Henney, O'Reilly).
• Правило 64 вдохновлено докладом Джейсона Киллиана на первом митапе TypeScript NYC в сентябре 2017 года.
• Правило 25 основано на примечаниях к выпуску версии TypeScript 2.1. Термин «эволюция any» редко используется за пределами самого компилятора TypeScript, но мне показалось, что для этого необычного паттерна будет полезно придумать название.
• Правило 46 вдохновлено публикацией в блоге Джесси Халлета.
• Правилу 47 очень помогла обратная связь, полученная от Титиан Черниковой-Драгомир в выпуске TypeScript №33128.
• Правило 49 основано на работе Йорка Яо (York Yao) с описанием программы type-coverage. Мне было нужно что-то в этом роде, и я нашел это!
• Правило 66 основано на материалах доклада, с которым я выступил на митапе TypeScript NYC Meetup в декабре 2017 года.
• За правило 52 я должен поблагодарить Дэвида Шелдрика (David Sheldric). Его сообщение в блоге Artsy, посвященное условным типам, сняло покров тайны с этой темы.
• Правило 70 появилось благодаря докладу Стива Фолкнера (Steve Faulkner) (он же southpolesteve) на митапе в феврале 2019 года.
• Правило 55 основано на моей статье для Medium и работе над программой typings-checker, которая со временем преобразовалась в dtslint.
• Правило 72 написано по материалам статьи Кэт Буш (Kat Busch) для Medium с описаниями различных видов перечислений в TypeScript, а также изложения этой темы Борисом Черным в книге «Programming TypeScript» (O'Reilly).
• Правило 60 появилось из-за путаницы по этой теме, которая была у меня и моих коллег. Исчерпывающее объяснение было найдено Андерсом в TypeScript PR #12253.
• При написании правила 75 огромную пользу принесла документация MDN.
• Глава 10 основана на моем опыте миграции стареющей библиотеки dygraphs.
Было еще множество постов и обсуждений, большинство из которых собраны в ветке r/typescript на Reddit. Отдельную благодарность хочу выразить разработчикам, предоставившим образцы кода, которые оказались очень полезны для понимания базовых особенностей TypeScript. Спасибо Мариусу Шульцу (Marius Schulz) за рассылку «TypeScript Weekly». Пусть она выходит не каждую неделю, но всегда оказывается отличным источником информации и помогает быть в курсе последних событий TypeScript. Андерсу, Дэниэлу, Райану и всей команде TypeScript в Microsoft — спасибо за общение и отзывчивость в решении возникавших проблем. Даже в случае простых недоразумений ничто не сравнится с тем, чтобы отправить баг и увидеть, как сам Андерс Хейлсберг мгновенно его исправляет.
В завершение хочу сказать спасибо Алекс за постоянную поддержку в течение всего проекта и понимание моей потребности в работе по утрам, вечерам и выходным.
Ваши замечания, предложения, вопросы отправляйте по адресу
(издательство «SprintBook», компьютерная редакция).
Мы будем рады узнать ваше мнение!