Привет, Хаброжители!
В 2020 году у издательского дома «Питер» вышел перевод «Эффективный TypeScript: 62 способа улучшить код», и книга сразу стала бестселлером. Прошло почти полных четыре года! Многое изменилось с тех пор, в том числе и вышла новая версия TypeScript. Дэн Вандеркам полностью переработал книгу, и мы представляем вам новый «Эффективный TypeScript: 83 способа улучшить код. 2-е изд.». Подробный! Понятный! С неизменным скворцом на обложке!
Но обо всём по порядку.
Сначала разберемся с основами. TypeScript часто называют «надмножеством» JavaScript. Можно даже сказать, что TypeScript — более «строгая» версия JS: в нем, например, запрещено использование формально допустимых, но сомнительных конструкций JS, таких как вызов функций с неправильным количеством аргументов. TypeScript — это во многом самостоятельный язык программирования со своими возможностями. Например, наличие в нем системы типов позволяет избегать многих ошибок, которые возникают при работе с JS. Понимание того, как грамотно использовать TypeScript, — ключ к его эффективному применению на практике.
Дэн Вандеркам в «Эффективном TypeScript» объясняет, как грамотно использовать эти самые возможности TypeScript. В этой книге рассмотрены востребованные проблемы, с которыми разработчики сталкиваются при использовании Typescript, приведены практические советы, ориентированные на достижение качественного результата. Советы иллюстрируются примерами кода. Автор, опираясь на собственный восьмилетний опыт разработки, дает рекомендации по тому, когда и — что немаловажно — почему их следует применять, ведь знание синтаксиса Typescript — это одно, а умение пользоваться его возможностями в подходящих контекстах — совсем другое. Отличительной чертой серии «эффективных» книг O’Reilly (см., например, «Эффективный Java») от стандартных справочных руководств является акцент на том, какой из путей решения определенной задачи лучше и почему.
Ядром книги являются по-прежнему актуальные основы языка и структуры программ на TypeScript, а не используемые в нем библиотеки и фреймворки. Что же нового появилось во второй версии «Эффективного TypeScript»?
Неустаревающая основа языка Typescript останется с вами на много лет… На 4 года точно! :)
Книга «Эффективный TypeScript» ориентирована на тех, кто уже имеет опыт программирования на TypeScript и JavaScript, ведь ее цель — научить вас использовать TypeScript наиболее эффективно и поднять уровень с новичка до эксперта. Впрочем, книга пригодится и тем, кто только начинает изучать TS, поскольку содержит всю необходимую информацию о языке.
Итак, прочитав «Эффективный TypeScript», вы научитесь:
В качестве примера рассмотрим одно из правил.
В JavaScript ничто не мешает повторно использовать переменную для другой цели, присвоив ей значение другого типа:
В TypeScript такое присваивание приводит к двум ошибкам:
Если навести курсор на первый productId в редакторе, станет ясно, в чем дело (рис. 3.3).
Рис. 3.3. Для productId выводится тип string
Основываясь на значении «12-34-56», TypeScript вывел для
Мы приходим к ключевой особенности типов TypeScript: может изменяться значение переменной, но не ее тип. Единственный распространенный случай изменения типа — сужение (правило 22). Однако при этом тип уменьшается, а не расширяется для включения новых значений. В правиле 25 описано важное исключение для этого правила, но это именно исключение, но не правило.
Как понимание этого принципа поможет исправить приведенный пример? Чтобы тип productId не изменялся, он должен быть достаточно широким для охвата как
Ошибки исправлены. Интересно, что TypeScript смог определить, что productId является string в первом вызове и number — во втором. Тип объединения был сужен на основании присваивания.
Хотя тип объединения сработал в этом варианте, дальше он может вызвать сложности. С типами объединений труднее работать, чем с простыми типами вроде
Лучшее решение — введение новой переменной:
В предыдущем варианте первый и второй
Вариант с двумя переменными лучше по нескольким причинам:
Общий принцип, который многократно встречается в этой главе, — изменение усложняет отслеживание логики кода модулем проверки типов. Попробуйте отслеживать переменные, изменяющие тип. Если использовать разные имена для разных концепций, ваш код станет более понятным как для людей, так и для модуля проверки типов.
Имейте в виду, что это не касается теневых переменных, как в приведенном примере:
Хотя две переменные
Приобрести «Эффективный TypeScript: 83 способа улучшить код. 2-е изд.» можно у нас на сайте.
» Оглавление
» Отрывок
По факту оплаты бумажной версии книги на e-mail высылается электронная книга.
Для Хаброжителей скидка 25% по купону — TypeScript
В 2020 году у издательского дома «Питер» вышел перевод «Эффективный TypeScript: 62 способа улучшить код», и книга сразу стала бестселлером. Прошло почти полных четыре года! Многое изменилось с тех пор, в том числе и вышла новая версия TypeScript. Дэн Вандеркам полностью переработал книгу, и мы представляем вам новый «Эффективный TypeScript: 83 способа улучшить код. 2-е изд.». Подробный! Понятный! С неизменным скворцом на обложке!
Но обо всём по порядку.
Сначала разберемся с основами. TypeScript часто называют «надмножеством» JavaScript. Можно даже сказать, что TypeScript — более «строгая» версия JS: в нем, например, запрещено использование формально допустимых, но сомнительных конструкций JS, таких как вызов функций с неправильным количеством аргументов. TypeScript — это во многом самостоятельный язык программирования со своими возможностями. Например, наличие в нем системы типов позволяет избегать многих ошибок, которые возникают при работе с JS. Понимание того, как грамотно использовать TypeScript, — ключ к его эффективному применению на практике.
Дэн Вандеркам в «Эффективном TypeScript» объясняет, как грамотно использовать эти самые возможности TypeScript. В этой книге рассмотрены востребованные проблемы, с которыми разработчики сталкиваются при использовании Typescript, приведены практические советы, ориентированные на достижение качественного результата. Советы иллюстрируются примерами кода. Автор, опираясь на собственный восьмилетний опыт разработки, дает рекомендации по тому, когда и — что немаловажно — почему их следует применять, ведь знание синтаксиса Typescript — это одно, а умение пользоваться его возможностями в подходящих контекстах — совсем другое. Отличительной чертой серии «эффективных» книг O’Reilly (см., например, «Эффективный Java») от стандартных справочных руководств является акцент на том, какой из путей решения определенной задачи лучше и почему.
Ядром книги являются по-прежнему актуальные основы языка и структуры программ на TypeScript, а не используемые в нем библиотеки и фреймворки. Что же нового появилось во второй версии «Эффективного TypeScript»?
- Оно полностью обновлено и переработано под TypeScript 5;
- добавлен еще 21 способ улучшить код;
- более подробно рассказано об условных типах, о которых в предыдущей версии книги только упоминалось;
- рассмотрены правила, касающиеся типов шаблонных литералов — одного из самых значительных нововведений в Typescript;
- добавлена глава, посвященная программированию на уровне типов;
Неустаревающая основа языка Typescript останется с вами на много лет… На 4 года точно! :)
Книга «Эффективный TypeScript» ориентирована на тех, кто уже имеет опыт программирования на TypeScript и JavaScript, ведь ее цель — научить вас использовать TypeScript наиболее эффективно и поднять уровень с новичка до эксперта. Впрочем, книга пригодится и тем, кто только начинает изучать TS, поскольку содержит всю необходимую информацию о языке.
Итак, прочитав «Эффективный TypeScript», вы научитесь:
- использовать вывод типов для обеспечения их безопасности при минимуме аннотаций к ним;
- создавать типы, чтобы писать понятный и стабильный код;
- моделировать сложные API, используя обобщенные типы (дженерики);
- работать с зависимостями и файлами объявления типов;
- переносить кодовую базу с JavaScript на TypeScript без потерь.
В качестве примера рассмотрим одно из правил.
Правило 19. Используйте разные переменные для разных типов
В JavaScript ничто не мешает повторно использовать переменную для другой цели, присвоив ей значение другого типа:
let productId = "12-34-56";
fetchProduct(productId); // Ожидается string
productId = 123456;
fetchProductBySerialNumber(productId); // Ожидается number
В TypeScript такое присваивание приводит к двум ошибкам:
let productId = "12-34-56";
fetchProduct(productId);
productId = 123456;
// ~~~~~~ Тип 'number' не может быть присвоен типу 'string'
fetchProductBySerialNumber(productId);
// ~~~~~~~~~
// Аргумент типа 'string' не может быть присвоен типу 'number'
Если навести курсор на первый productId в редакторе, станет ясно, в чем дело (рис. 3.3).
Рис. 3.3. Для productId выводится тип string
Основываясь на значении «12-34-56», TypeScript вывел для
productId
тип string
. Нельзя присвоить number
типу string
— отсюда и ошибка.Мы приходим к ключевой особенности типов TypeScript: может изменяться значение переменной, но не ее тип. Единственный распространенный случай изменения типа — сужение (правило 22). Однако при этом тип уменьшается, а не расширяется для включения новых значений. В правиле 25 описано важное исключение для этого правила, но это именно исключение, но не правило.
Как понимание этого принципа поможет исправить приведенный пример? Чтобы тип productId не изменялся, он должен быть достаточно широким для охвата как
string
, так и number
. Это и есть определение типа объединения string|number
:let productId: string | number = "12-34-56";
fetchProduct(productId);
productId = 123456; // OK
fetchProductBySerialNumber(productId); // OK
Ошибки исправлены. Интересно, что TypeScript смог определить, что productId является string в первом вызове и number — во втором. Тип объединения был сужен на основании присваивания.
Хотя тип объединения сработал в этом варианте, дальше он может вызвать сложности. С типами объединений труднее работать, чем с простыми типами вроде
string
или number
, поскольку приходится проверять, чем являются переменные, прежде чем что-либо делать с ними.Лучшее решение — введение новой переменной:
const productId = "12-34-56";
fetchProduct(productId);
const serial = 123456; // OK
fetchProductBySerialNumber(serial); // OK
В предыдущем варианте первый и второй
productId
не имели семантической связи друг с другом. Их связывало только переиспользование той же переменной. Такой код «сбивает с толку» модуль проверки типов и к тому же плохо воспринимается человеком.Вариант с двумя переменными лучше по нескольким причинам:
- разделяет два несвязанных понятия (идентификатор и серийный номер);
- позволяет использовать более конкретные имена переменных;
- повышает качество вывода типов, в связи с чем уже не требуется применять к ним аннотации;
- получаются более простые типы (
string
иnumber
, а неstring|number
); - позволяет объявлять переменные c
const
вместо let, что упрощает их понимание как модулем проверки типов, так и людьми.
Общий принцип, который многократно встречается в этой главе, — изменение усложняет отслеживание логики кода модулем проверки типов. Попробуйте отслеживать переменные, изменяющие тип. Если использовать разные имена для разных концепций, ваш код станет более понятным как для людей, так и для модуля проверки типов.
const
в программе должно быть намного больше, чем let
.Имейте в виду, что это не касается теневых переменных, как в приведенном примере:
const productId = "12-34-56";
fetchProduct(productId);
{
const productId = 123456; // OK
fetchProductBySerialNumber(productId); // OK
}
Хотя две переменные
productId
имеют одинаковые имена, это две разные переменные, не связанные друг с другом. Они имеют разные типы, и это вполне нормально. TypeScript легко различит их, но у человека, читающего код, могут возникнуть сложности. Поэтому в таких случаях лучше присваивать разные имена. Некоторые команды устанавливают запрет на теневое применение переменных, используя правила линтера, например no-shadow в eslint
.СЛЕДУЕТ ЗАПОМНИТЬ:
- Значение переменной может меняться, но ее тип обычно остается неизменным.
- Во избежание путаницы — как для человека, так и для модуля проверки типов — избегайте повторного использования имен переменных для обозначения другого типа.
Об авторе
Приобрести «Эффективный TypeScript: 83 способа улучшить код. 2-е изд.» можно у нас на сайте.
» Оглавление
» Отрывок
По факту оплаты бумажной версии книги на e-mail высылается электронная книга.
Для Хаброжителей скидка 25% по купону — TypeScript
Комментарии (2)
Femistoklov
29.01.2025 22:12В чём отличие книги от https://habr.com/ru/companies/piter/articles/861206/?
Sirion
При всём уважении, приведённый пример выглядит как "снимите штаны перед тем, как покакать" даже для меня, который на тайпскрипте серьёзно пишет меньше полугода. Интересно было бы увидеть какой-то менее тривиальный совет.