эффективный typescript 62 способа улучшить код

admin

Эффективный TypeScript: 62 способа улучшить код. Дэн Вандеркам

Описание

Книга «Эффективный TypeScript: 62 способа улучшить код Дэна Вандеркама» представляет собой сборник кратких правил.

Заголовок каждого правила содержит совет, поэтому ознакомьтесь с оглавлением. Если, например, вы пишете документацию и сомневаетесь, надо ли писать информацию типов, обратитесь к оглавлению и правилу 30 («Не повторяйте информацию типа в документации»).

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

Прочитав каждый совет, вы сможете понять, как именно и почему он поможет вам использовать TypeScript более эффективно. Вы также поймете, если он окажется непригодным в каком-то случае. Мне запомнился пример, приведенный Скоттом Майерсом, автором книги «Эффективный C++»: разработчики ПО для ракет могли пренебречь советом о предупреждении утечки ресурсов, потому что их программы уничтожались при попадании ракеты в цель. Мне неизвестно о существовании ракет с системой управления, написанной на JavaScript, но такое ПО есть на телескопе James Webb. Поэтому будьте осторожны.

Каждое правило заканчивается блоком «Следует запомнить». Бегло просмотрев его, вы сможете составить общее представление о материале и выделить главное. Но я настоятельно рекомендую читать правило полностью.

Источник

Книга «Эффективный TypeScript: 62 способа улучшить код»

Структура книги

Книга представляет собой сборник кратких эссе (правил). Правила объединены в тематические разделы (главы), к которым можно обращаться автономно в зависимости от интересующего вопроса.

Заголовок каждого правила содержит совет, поэтому ознакомьтесь с оглавлением. Если, например, вы пишете документацию и сомневаетесь, надо ли писать информацию типов, обратитесь к оглавлению и правилу 30 («Не повторяйте информацию типа в документации»).
Практически все выводы в книге продемонстрированы на примерах кода. Думаю, вы, как и я, склонны читать технические книги, глядя в примеры и лишь вскользь просматривая текстовую часть. Конечно, я надеюсь, что вы внимательно прочитаете объяснения, но основные моменты я отразил в примерах.

Прочитав каждый совет, вы сможете понять, как именно и почему он поможет вам использовать TypeScript более эффективно. Вы также поймете, если он окажется непригодным в каком-то случае. Мне запомнился пример, приведенный Скоттом Майерсом, автором книги «Эффективный C++»: разработчики ПО для ракет могли пренебречь советом о предупреждении утечки ресурсов, потому что их программы уничтожались при попадании ракеты в цель. Мне неизвестно о существовании ракет с системой управления, написанной на JavaScript, но такое ПО есть на телескопе James Webb. Поэтому будьте осторожны.

Каждое правило заканчивается блоком «Следует запомнить». Бегло просмотрев его, вы сможете составить общее представление о материале и выделить главное. Но я настоятельно рекомендую читать правило полностью.

Отрывок. ПРАВИЛО 4. Привыкайте к структурной типизации

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

К примеру, вы работаете с библиотекой физических характеристик и у вас есть тип вектора 2D:

Вы пишете функцию для вычисления его длины:

и вводите определение вектора named:

Функция calculateLength будет работать с NamedVector, так как в нем присутствуют свойства x и y, являющиеся number. TypeScript это понимает:

Интересно то, что вы не объявляли связь между Vector2D и NamedVector. Вам также не пришлось прописывать альтернативное выполнение calculateLength для NamedVector. Система типов TypeScript моделирует поведение JavaScript при выполнении (правило 1), что позволило NamedVector вызвать calculateLength на основании того, что его структура сопоставима с Vector2D. Отсюда выражение «структурная типизация».

Но это также может привести и к проблемам. Допустим, вы добавите тип вектора 3D:

и напишете функцию, чтобы нормализовать векторы (сделать их length равной 1):

Если вы вызовете эту функцию, то, вероятнее всего, получите больше, чем единичную длину:

Что же пошло не так и почему TypeScript не сообщил об ошибке?

Баг заключается в том, что calculateLength работает с векторами 2D, а normalize — с 3D. Поэтому компонент z игнорируется при нормализации.

Может показаться странным, что модуль проверки типов не уловил этого. Почему допускается вызов calculateLength 3D-вектором, несмотря на то что ее тип работает с 2D-векторами?
То, что работало хорошо с named, здесь привело к обратному результату. Вызов calculateLength объектом не выдает ошибку. Следовательно, модуль проверки типов не жалуется, что в итоге приводит к появлению бага. Если вы захотите, чтобы в подобном случае ошибка все же обнаруживалась, обратитесь к правилу 37.

Прописывая функции, легко представить, что они будут вызываться свойствами, которые вы объявили, и никакими другими. Это называется «запечатанный», или «точный», тип и не может быть применено в системе типов TypeScript. Нравится вам это или нет, но здесь типы открыты.

Иногда это приводит к сюрпризам:

Почему это ошибка? Поскольку axis является одним из ключей v из Vector3D, то он должен быть x, y или z. А согласно изначальному объявлению Vector3D, они все являются numbers. Следовательно, не должен ли тип coord также быть number?

Это не ложная ошибка. Мы знаем, что Vector3D строго определен и не имеет иных свойств. Хотя мог бы:

Поскольку v, вероятно, мог иметь любые свойства, то тип axis является string. У TypeScript нет причин считать v[axis] только числом. При итерации объектов может быть сложно добиться корректной типизации. Мы вернемся к этой теме в правиле 54, а сейчас обойдемся без циклов:

Структурная типизация может также служить причиной сюрпризов в классах, которые сравниваются на предмет возможного назначения свойств:

Почему d может быть назначен для C? У него есть свойство foo, являющееся string. Еще у него есть constructor (из Object.prototype), который может быть вызван аргументом (хотя обычно он вызывается без него). Итак, структуры совпадают. Это может привести к неожиданностям, если у вас присутствует логика в конструкторе C и вы напишете функцию, подразумевающую его запуск. В этом существенное отличие от языков вроде C++ или Java, где объявления параметра типа C гарантирует, что он будет принадлежать именно C либо его подклассу.

Структурная типизация хорошо помогает при написании тестов. Допустим у вас есть функция, которая выполняет запрос в базу данных и обрабатывает результат.

Чтобы ее протестировать, вы могли бы создать имитацию PostgresDB. Однако лучшим решением будет использование структурной типизации и определение более узкого интерфейса:

Вы по-прежнему можете передать postgresDB функции getAuthors в вывод, поскольку в ней есть метод runQuery. Структурная типизация не обязывает PostgresDB сообщать, что она выполняет DB. TypeScript сам определит это.

При написании тестов вы можете передавать и более простой объект:

TypeScript определит, что тестовый DB соответствует интерфейсу. В то же время ваши тесты совершенно не нуждаются в информации о базе данных вывода: не требуется никаких имитированных библиотек. Введя абстракцию (DB), мы освободили логику от деталей выполнения (PostgresDB).

Еще одним преимуществом структурной типизации является то, что она способна четко обрывать зависимости между библиотеками. Больше информации по этой теме вы найдете в правиле 51.

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

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

Используйте структурную типизацию для упрощения тестирования элементов.

ПРАВИЛО 5. Ограничьте применение типов any

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

Модуль проверки прав, указывая на ошибку, но ее обнаружение можно исключить, просто добавив as any. Когда вы начинаете работать с TypeScript, становится заманчивым использование типов any или утверждений as any при непонимании ошибки, недоверии к модулю проверки или нежелании тратить время на прописывание типов. Но помните, что any нивелирует многие преимущества TypeScript, а именно:

Снижает безопасность кода

В примере выше, согласно объявленному типу, age является number. Но any позволил назначить для него строку. Модуль проверки будет считать, что это число (ведь именно так вы объявили), что приведет к появлению путаницы.

Позволяет нарушать условия

Создавая функцию, вы ставите условие, что, получив от вызова определенный тип данных, она произведет соответствующий тип при выводе, которое нарушается так:

Параметр даты рождения birthDate должен быть Date, а не string. Тип any позволил нарушить условие, относящееся к calculateAge. Это может оказаться особенно проблематичным, так как JavaScript имеет склонность к неявной конвертации типов. Из-за этого string в некоторых случаях сработает там, где предполагается number, но неизбежно даст сбой в другом месте.

Исключает поддержку языковой службы

Если символу присвоен тип, языковые службы TypeScript способны предоставить соответствующую автоподстановку и контекстную документацию (рис. 1.3).

image loader

Однако, присваивая символам тип any, вам придется все делать самостоятельно (рис. 1.4).

image loader

И переименование тоже. Если у вас есть тип Person и функции для форматирования имени:

тогда вы можете выделить first в редакторе и выбрать Rename Symbol для его переименования в firstName (рис. 1.5 и рис. 1.6).

Это изменит функцию formatName, но не в случае с any:

image loader

Для Хаброжителей скидка 25% по купону — TypeScript

По факту оплаты бумажной версии книги на e-mail высылается электронная книга.

Источник

Эффективный TypeScript, 62 способа улучшить код, Вандеркам Д., 2020

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

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

Также можно купить бумажную версию книги здесь.

Эффективный TypeScript, 62 способа улучшить код, Вандеркам Д., 2020.

«Эффективный TypeScript» необходим тем, кто уже имеет опыт работы с JavaScript. Цель этой книги — не научить пользоваться инструментами, а помочь повысить профессиональный уровень.
TypeScript представляет собой не просто систему типов, а набор служб языка, удобных в использовании. Он повышает безопасность разработки в JavaScript, делает работу увлекательнее и проще.

129087

Вывод типов.
Для промышленных языков программирования выражения «статически типизированный» и «строго типизированный» традиционно считались синонимичными. С, C++, Java — все они подразумевают прописывание типов. Однако академические языки никогда эти два понятия не отождествляли: языки вроде МL или Haskell на протяжении долгого времени имели сложные системы вывода типов, а за последние 10 лет подобная специфика начала проявляться и в промышленных языках. C++ обзавелся auto, a Java получил var.

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

Оглавление.
Отзывы.
ВВЕДЕНИЕ.
ГЛАВА 1. ЗНАКОМСТВО С TYPESCRIPT.
ГЛАВА 2. СИСТЕМА ТИПОВ В TYPESCRIPT.
ГЛАВА 3. ВЫВОД ТИПОВ.
ГЛАВА 4. ПРОЕКТИРОВАНИЕ ТИПОВ.
ГЛАВА 5. ЭФФЕКТИВНОЕ ПРИМЕНЕНИЕ ANY.
ГЛАВА 6. ДЕКЛАРАЦИИ ТИПОВ И ©TYPES.
ГЛАВА 7. НАПИСАНИЕ И ЗАПУСК КОДА.
ГЛАВА 8. ПЕРЕНОС ДАННЫХ В TYPESCRIPT.
ОБ АВТОРЕ.
ОБ ОБЛОЖКЕ.

По кнопкам выше и ниже «Купить бумажную книгу» и по ссылке «Купить» можно купить эту книгу с доставкой по всей России и похожие книги по самой лучшей цене в бумажном виде на сайтах официальных интернет магазинов Лабиринт, Озон, Буквоед, Читай-город, Литрес, My-shop, Book24, Books.ru.

По кнопке «Найти похожие материалы на других сайтах» можно найти похожие материалы на других сайтах.

On the buttons above and below you can buy the book in official online stores Labirint, Ozon and others. Also you can search related and similar materials on other sites.

Источник

Эффективный typescript 62 способа улучшить код

eXOlnCDo80zDDRdjkateAq2vcekRoAT0M7jOBmTVaJzv NbdDktIV HQ0Rr7O69oRncWuMJT

eXOlnCDo80zDDRdjkateAq2vcekRoAT0M7jOBmTVaJzv NbdDktIV HQ0Rr7O69oRncWuMJT

Physics.Math.Code запись закреплена

Эффективный TypeScript: 62 способа улучшить код [2020] Вандеркам

«Эффективный TypeScript» необходим тем, кто уже имеет опыт работы с JavaScript. Цель этой книги — не научить пользоваться инструментами, а помочь повысить профессиональный уровень.

TypeScript представляет собой не просто систему типов, а набор служб языка, удобных в использовании. Он повышает безопасность разработки в JavaScript, делает работу увлекательнее и проще.
— Изучите все тонкости системы типов
— Используйте типы так, чтобы код был более безопасным и понятным
— Воспользуйтесь тактическими преимуществами типов
— Разберитесь в принципах зависимостей и типов TypeScript
— Перенесите код из JavaScript в TypeScript
Дэн Вандеркам работает главным инженером в Sidewalk Labs, а также является соучредителем митапа TypeScript NYC. Долгое время был участником открытых проектов. Принимал участие в разработке поисковой системы Google, которой пользуются миллионы людей во всём мире.

”Эффективный TypeScript” рассматривает наиболее распространенные проблемы, с которыми мы сталкиваемся при работе с TypeScript, и дает практические советы. Книга будет полезна независимо от вашего опыта.
Райан Кавано, ведущий инженер по TypeScript в Microsoft
”Эффективный TypeScript” содержит практические рецепты и должна лежать на столе у каждого профессионального разработчика. Даже если вы думаете, что знаете TypeScript, купите эту книгу и не пожалеете».
Яков Файн, чемпион по Java

Источник

Tags: , , ,