Иван Греков написал статью об опыте миграции на TypeScript фронтенд-проектов команды Badoo — "Как перенести на TypeScript большую кодовую базу React UI-компонентов".
В статье мало технических деталей. В ней в основном рассказывается про организацию процесса миграции. Переводу проектов очень помогло выравнивание знаний о TypeScript в команде. Для этого все компоненты были распределены по разным уровням сложности миграции. Также использовали базу знаний команды с соглашениями по использованию типизированного кода. Регулярно оценивали прогресс миграции, что увеличило прозрачность всего процесса как для команды, так и для руководства.
Использованные инструменты и утилиты. Для предварительной оценки кодовой базы и мониторинга прогресса использовали cloc. С помощью утилиты madge был построен граф зависимостей проектов, чтобы определить порядок миграции модулей. Использовали кодмоды для перевода JS-компонентов на TS.
В итоге за три месяца работы было мигрировано 630 React-компонентов.
Рекомендую почитать статью, если планируете мигрировать большой проект на TS (или любую другую технологию).
#migartion #typescript
https://habr.com/ru/company/badoo/blog/518246/
В статье мало технических деталей. В ней в основном рассказывается про организацию процесса миграции. Переводу проектов очень помогло выравнивание знаний о TypeScript в команде. Для этого все компоненты были распределены по разным уровням сложности миграции. Также использовали базу знаний команды с соглашениями по использованию типизированного кода. Регулярно оценивали прогресс миграции, что увеличило прозрачность всего процесса как для команды, так и для руководства.
Использованные инструменты и утилиты. Для предварительной оценки кодовой базы и мониторинга прогресса использовали cloc. С помощью утилиты madge был построен граф зависимостей проектов, чтобы определить порядок миграции модулей. Использовали кодмоды для перевода JS-компонентов на TS.
В итоге за три месяца работы было мигрировано 630 React-компонентов.
Рекомендую почитать статью, если планируете мигрировать большой проект на TS (или любую другую технологию).
#migartion #typescript
https://habr.com/ru/company/badoo/blog/518246/
Хабр
Как перенести на TypeScript большую кодовую базу React UI-компонентов
Привет! Меня зовут Иван Греков, я работаю UI-разработчиком в frontend-команде Badoo. Главные задачи нашей команды — создание новых и поддержка существующих пользовательских интерфейсов для сайтов и...
Сергей Руденко из Airbnb написал статью про миграцию кодовой базы фррнтенда компании с JavaScript на TypeScript — "ts-migrate: A Tool for Migrating to TypeScript at Scale".
Для миграции они разработали инструмент ts-migrate, который помогает в массовой конвертации JavaScript файлов. Для автоматического поиска проблемных мест в коде и запуска необходимых трансформаций используются диагностики TypeScript language server. Трансформации представляют собой кодмоды, которые могут использовать jscodeshift, AST TypeScript или могут работать с исходным кодом как с обычным текстом. Есть трансформации для упрощения миграции на TypeScript React-компонентов, но без поддержки хуков.
Благодаря ts-migrate в Airbnb на TypeScript было переведено более 80% всей кодовой базы фронтенда (6 миллионов строк кода). Но так как утилита устанавливает
Рекомендую почитать статью, если планируете перевести код своего проекта на TypeScript.
#typescript #migration #tool
https://medium.com/airbnb-engineering/ts-migrate-a-tool-for-migrating-to-typescript-at-scale-cd23bfeb5cc
Для миграции они разработали инструмент ts-migrate, который помогает в массовой конвертации JavaScript файлов. Для автоматического поиска проблемных мест в коде и запуска необходимых трансформаций используются диагностики TypeScript language server. Трансформации представляют собой кодмоды, которые могут использовать jscodeshift, AST TypeScript или могут работать с исходным кодом как с обычным текстом. Есть трансформации для упрощения миграции на TypeScript React-компонентов, но без поддержки хуков.
Благодаря ts-migrate в Airbnb на TypeScript было переведено более 80% всей кодовой базы фронтенда (6 миллионов строк кода). Но так как утилита устанавливает
any
в проблемных местах, у ребят осталось ещё много работы над добавлением полноценных типов.Рекомендую почитать статью, если планируете перевести код своего проекта на TypeScript.
#typescript #migration #tool
https://medium.com/airbnb-engineering/ts-migrate-a-tool-for-migrating-to-typescript-at-scale-cd23bfeb5cc
Medium
ts-migrate: A Tool for Migrating to TypeScript at Scale
Learn about how we used codemods to accelerate migration from JavaScript to TypeScript at Airbnb.
Инженеры Quip написали две статьи про опыт миграции большого проекта на TypeScript — "The Road to TypeScript at Quip".
Рассматривалось несколько вариантов миграция проекта на TypeScript. Постепенный перенос кода не подходил, так как это бы повлекло за собой много проблем. Разработчики в итоге решили сделать несколько "больших взрывов" для обновления кода. Сначала нужно было перевести код на нативную модульную систему, потом сконвертировать
Исходная кодовая база Quip была покрыта типами Google Closure Compiler. Для конвертирования этих типов можно было воспользоваться утилитой Gents от Google, но он не подходил, так как в проекте использовался специфичный синтаксис, поэтому нужно было написать свой конвертер.
Процесс перехода был удачен. За три месяца были исправлены все основные ошибки типизации. Сейчас ребята включили
Очень интересные статьи. Рекомендую почитать всем, кто задумывается о переводе своей кодовой базы на TypeScript.
#typescript #migration
https://quip.com/blog/the-road-to-typescript-at-quip-part-one
https://quip.com/blog/the-road-to-typescript-at-quip-part-two
Рассматривалось несколько вариантов миграция проекта на TypeScript. Постепенный перенос кода не подходил, так как это бы повлекло за собой много проблем. Разработчики в итоге решили сделать несколько "больших взрывов" для обновления кода. Сначала нужно было перевести код на нативную модульную систему, потом сконвертировать
React.createClass
в нативные классы, а затем перевести весь код на TypeScript.Исходная кодовая база Quip была покрыта типами Google Closure Compiler. Для конвертирования этих типов можно было воспользоваться утилитой Gents от Google, но он не подходил, так как в проекте использовался специфичный синтаксис, поэтому нужно было написать свой конвертер.
Процесс перехода был удачен. За три месяца были исправлены все основные ошибки типизации. Сейчас ребята включили
--strict
режим компиляции, и ошибки снова появились, но ничего критично они не выявили.Очень интересные статьи. Рекомендую почитать всем, кто задумывается о переводе своей кодовой базы на TypeScript.
#typescript #migration
https://quip.com/blog/the-road-to-typescript-at-quip-part-one
https://quip.com/blog/the-road-to-typescript-at-quip-part-two
Quip
The Road to TypeScript at Quip, Part One
Роб Палмер из Bloomberg рассказал об опыте использования TypeScript с огромной кодовой базой — "10 Insights from Adopting TypeScript at Scale".
В статье рассказывается о наиболее интересных вызовах, которые решала команда, занимающаяся разработкой инфраструктуры. Вот некоторые из них: динамическая генерация и использование универсального tsconfig для разных проектов, работа с зависимостями, дедупликация типов, гарантирование энкапсуляции приватных интерфейсов, решение проблем с инлайном типов в сгенерированных декларациях.
TypeScript в Bloomberg используется как "JavaScript с типами", то есть без использования фич, которые не были стандартизированы TC39 (декораторы, enum, namespace и т.п.) Такой подход значительно облегчает дебаг сгенерированного JavaScript-кода и оставляет возможность для работы с JS-движками (задел на будущее), которые смогут отбрасывать типы и запускать TypeScript-код без предварительной компиляции.
Очень большая и крутая статья. Рекомендую почитать всем, кто работает с TypeScript.
#typescript #migration
https://www.techatbloomberg.com/blog/10-insights-adopting-typescript-at-scale/
В статье рассказывается о наиболее интересных вызовах, которые решала команда, занимающаяся разработкой инфраструктуры. Вот некоторые из них: динамическая генерация и использование универсального tsconfig для разных проектов, работа с зависимостями, дедупликация типов, гарантирование энкапсуляции приватных интерфейсов, решение проблем с инлайном типов в сгенерированных декларациях.
TypeScript в Bloomberg используется как "JavaScript с типами", то есть без использования фич, которые не были стандартизированы TC39 (декораторы, enum, namespace и т.п.) Такой подход значительно облегчает дебаг сгенерированного JavaScript-кода и оставляет возможность для работы с JS-движками (задел на будущее), которые смогут отбрасывать типы и запускать TypeScript-код без предварительной компиляции.
Очень большая и крутая статья. Рекомендую почитать всем, кто работает с TypeScript.
#typescript #migration
https://www.techatbloomberg.com/blog/10-insights-adopting-typescript-at-scale/
Bloomberg L.P.
10 Insights from Adopting TypeScript at Scale | Bloomberg LP
Rob Palmer shares some of the insights & lessons learned during Bloomberg Engineering's journey to adopt TypeScript as a first-class supported language.
Неделя релизов продолжается. Вчера вышел TypeScript 4.1. Дениэл Розенвассер рассказал о всех изменениях в новой версии.
В TypeScript 4.1 были добавлены литеральные шаблонные типы (Template Literal Types). Благодаря им можно описывать типы, состоящие из нескольких строковых литеральных типов. Также они позволяют на уровне типов "извлекать" строковые литералы из других литералов. В рамках этой фичи были добавлены новые утилитарные типы для манипуляции строками —
С новой версии можно ремапить ключи в отображаемых типах (mapped types). Это можно использовать для фильтрации свойств объектных типов или создания новых объектных типов с ключами, использующими литеральные шаблонные типы.
Появилась полноценная поддержка рекурсивных условных типов. Полезно для описания типов рекурсивных структур. Разработчики советуют не злоупотреблять этой фичей, так как она может негативно повлиять на производительность проверки типов.
Добавлен флаг
Есть несколько ломающих изменений. Условные спрэды создают опциональные свойства. Нужно обязательно указывать параметр функции
#release #typescript
https://devblogs.microsoft.com/typescript/announcing-typescript-4-1
В TypeScript 4.1 были добавлены литеральные шаблонные типы (Template Literal Types). Благодаря им можно описывать типы, состоящие из нескольких строковых литеральных типов. Также они позволяют на уровне типов "извлекать" строковые литералы из других литералов. В рамках этой фичи были добавлены новые утилитарные типы для манипуляции строками —
Uppercase
, Lowercase
, Capitalize
, Uncapitalize
.С новой версии можно ремапить ключи в отображаемых типах (mapped types). Это можно использовать для фильтрации свойств объектных типов или создания новых объектных типов с ключами, использующими литеральные шаблонные типы.
Появилась полноценная поддержка рекурсивных условных типов. Полезно для описания типов рекурсивных структур. Разработчики советуют не злоупотреблять этой фичей, так как она может негативно повлиять на производительность проверки типов.
Добавлен флаг
--noUncheckedIndexedAccess
для более строгой проверки доступа к элементам массивов или свойствам объектов. Параметр paths
теперь можно использовать без указания baseUrl
. Теперь необязательно включать allowJs
при использовании опции checkJs
. Добавлена поддержка фабрик jsx
и jsxs
из React 17 (используются транспиляторами).Есть несколько ломающих изменений. Условные спрэды создают опциональные свойства. Нужно обязательно указывать параметр функции
resolve
у промисов. Абстрактные члены больше не могут объявляться с async
. Если в условном выражении falsy-позиция возвращает тип any`/`unknown
, то any`/`unknown
будет распространено на всё выражение.#release #typescript
https://devblogs.microsoft.com/typescript/announcing-typescript-4-1
Microsoft News
Announcing TypeScript 4.1
Today we’re proud to release TypeScript 4.1! If you’re unfamiliar with TypeScript, it’s a language that builds on JavaScript by adding syntax for type declarations and annotations. This syntax can be used by the TypeScript compiler to type-check our code…
Стэфан Баумгартнер написал статью о том, почему не стоит использовать некоторые ООП-фичи TypeScript — "Tidy TypeScript: Avoid traditional OOP patterns".
Не нужно использовать статические классы. Они пришли в TypeScript из языков, где классы — основной механизм для структурирования кода. В мире JavaScript есть другие возможности, например, обычные модули.
Пространства имён (namespaces) были добавлены в TypeScript в первых версиях языка для удобства работы с кодом. Сейчас их могут прекрасно заменить модули. Неймспейсы иногда могут быть полезны во внешних файлах декларации, но их не следует использовать в коде проекта.
Ещё Стэфан предлагает отказаться от использования абстрактных классов. Абстрактные классы транспилируются в обычные классы, они могут быть без проблем инстанцированы в JavaScript, что может привести к проблемам.
Хорошая статья, но последний пункт про абстрактные классы мне кажется спорным.
#typescript
https://fettblog.eu/tidy-typescript-avoid-traditional-oop/
Не нужно использовать статические классы. Они пришли в TypeScript из языков, где классы — основной механизм для структурирования кода. В мире JavaScript есть другие возможности, например, обычные модули.
Пространства имён (namespaces) были добавлены в TypeScript в первых версиях языка для удобства работы с кодом. Сейчас их могут прекрасно заменить модули. Неймспейсы иногда могут быть полезны во внешних файлах декларации, но их не следует использовать в коде проекта.
Ещё Стэфан предлагает отказаться от использования абстрактных классов. Абстрактные классы транспилируются в обычные классы, они могут быть без проблем инстанцированы в JavaScript, что может привести к проблемам.
Хорошая статья, но последний пункт про абстрактные классы мне кажется спорным.
#typescript
https://fettblog.eu/tidy-typescript-avoid-traditional-oop/
fettblog.eu
Tidy TypeScript: Avoid traditional OOP patterns
This is the third article in a series of articles where I want to highlight ways on how to keep your TypeScript code neat and tidy. This series is heavily opinionated and you might find out things you don’t like. Don’t take it personally, it’s just an opinion.
Стэфан Баумгартнер показал на примере как затипизировать сложную функцию для отправки запросов — "Dynamic Static Typing In TypeScript".
В статье разбирается типизация Express-like функции для отправки GET-запросов. Сначала она типизируется "в лоб". Потом пример немного усложняется: добавляются юнионы, дженерики. В конце статьи разбирается довольно интересный кейс с использованием литеральных шаблонных типов и рекурсивных условных типов (появились в TypeScript 4.1) для извлечения имён параметров из строки.
Хорошая статья. Рекомендую почитать всем, кто работает с TypeScript.
#typescript
https://www.smashingmagazine.com/2021/01/dynamic-static-typing-typescript/
В статье разбирается типизация Express-like функции для отправки GET-запросов. Сначала она типизируется "в лоб". Потом пример немного усложняется: добавляются юнионы, дженерики. В конце статьи разбирается довольно интересный кейс с использованием литеральных шаблонных типов и рекурсивных условных типов (появились в TypeScript 4.1) для извлечения имён параметров из строки.
Хорошая статья. Рекомендую почитать всем, кто работает с TypeScript.
#typescript
https://www.smashingmagazine.com/2021/01/dynamic-static-typing-typescript/
Smashing Magazine
Dynamic Static Typing In TypeScript — Smashing Magazine
In this article, we look at some of the more advanced features of TypeScript, like union types, conditional types, template literal types, and generics. We want to formalize the most dynamic JavaScript behavior in a way that we can catch most bugs before…
Два дня назад вышел TypeScript 4.2. Дениэл Розенвассер рассказал о всех фичах новой версии.
TypeScript теперь отслеживает использование объединений как альясов типов. Благодаря этому такие альясы отображаются в сообщениях об ошибках, в генерируемых d.ts-файлах и т.д.
В новой версии TypeScript возможно использовать rest-элементы в любой позиции кортежа, но остаётся одно ограничение — они не могут идти после других rest-элементов и до опциональных элементов. Также при деструктуризации кортежей неиспользуемые элементы можно пометить символом подчёркивания
Появилась новая опция
С сигнатурами конструкторов теперь можно использовать модификатор
Если внутри логических выражений с
Появилась поддержка флага
Также была включена строгая проверка оператора
#release #typescript
https://devblogs.microsoft.com/typescript/announcing-typescript-4-2/
TypeScript теперь отслеживает использование объединений как альясов типов. Благодаря этому такие альясы отображаются в сообщениях об ошибках, в генерируемых d.ts-файлах и т.д.
В новой версии TypeScript возможно использовать rest-элементы в любой позиции кортежа, но остаётся одно ограничение — они не могут идти после других rest-элементов и до опциональных элементов. Также при деструктуризации кортежей неиспользуемые элементы можно пометить символом подчёркивания
_
( let [_first, second] = getValues();
), чтобы не возникала ошибка с включённой опцией noUnusedLocals
.Появилась новая опция
noPropertyAccessFromIndexSignature
. Она отключает возможность использования точки для доступа к тем свойствам объекта, которые определяются с помощью сигнатуры строчного индекса (string index signature).С сигнатурами конструкторов теперь можно использовать модификатор
abstract
. Эта фича даёт возможность типизации некоторых ООП-техник.Если внутри логических выражений с
&&
и ||
будет находиться функция без её вызова, это будет приводить к ошибке компиляции под флагом --strictNullChecks
.Появилась поддержка флага
--explainFiles
. С его помощью можно понять, почему файл был включён в процесс компиляции.Также была включена строгая проверка оператора
in
, и ослаблены правила взаимодействия между опциональными свойствами и сигнатурами строчного индекса.#release #typescript
https://devblogs.microsoft.com/typescript/announcing-typescript-4-2/
Microsoft News
Announcing TypeScript 4.2
Today we’re excited to announce the release of TypeScript 4.2! For those who aren’t familiar with TypeScript, it’s an extension to JavaScript that adds static types and type-checking. With types, you can state exactly what your functions take, and what they’ll…
Недавно вышло новое официальное руководство по TypeScript, над которым шла работа с 2018 года. Орта Терокс рассказал обо всех основных изменениях — "Announcing the New TypeScript Handbook".
Новая версия руководства была полностью переработана. Теперь это не набор статей, а полноценная книга, которую можно рекомендовать всем, кто только начинает изучать TypeScript. В руководстве нет разделов, связанных с JavaScript, поэтому для совсем начинающих оно не подходит. Чтобы не перегружать читателей информацией, все редкие кейсы использования TypeScript были перемещены в справочник. Руководство доступно онлайн на основном сайте, а также его можно скачать в форматах pdf/ePub для чтения в оффлайне.
#typescript #book
https://devblogs.microsoft.com/typescript/announcing-the-new-typescript-handbook/
Новая версия руководства была полностью переработана. Теперь это не набор статей, а полноценная книга, которую можно рекомендовать всем, кто только начинает изучать TypeScript. В руководстве нет разделов, связанных с JavaScript, поэтому для совсем начинающих оно не подходит. Чтобы не перегружать читателей информацией, все редкие кейсы использования TypeScript были перемещены в справочник. Руководство доступно онлайн на основном сайте, а также его можно скачать в форматах pdf/ePub для чтения в оффлайне.
#typescript #book
https://devblogs.microsoft.com/typescript/announcing-the-new-typescript-handbook/
Microsoft News
Announcing the New TypeScript Handbook
Hey folks, we’re happy to announce that a fresh re-write of the TypeScript Handbook is out of beta and is now our website’s primary resource for learning TypeScript! Read the handbook on Web / Epub / PDF In the last year,
Тим Ван Дер Лип из команды разработки Chrome написал статью о миграции DevTools на TypeScript — "DevTools architecture refresh: migrating DevTools to TypeScript".
Кодовой базе Chrome DevTools уже более 10 лет. За это время она выросла до 150 тысяч строк кода и пережила несколько больших изменений. Например, в 2013 году в ней стал использоваться Closure Compiler в качестве тайпчекера. Но в 2019 году было решено отказаться от Closure в пользу TypeScript, так как Closure не обеспечивал должный уровень типобезопасности.
Автоматизировать миграцию не получилось, поэтому весь процесс занял 13 месяцев. Для распараллеливания работы между инженерами во все файлы был добавлен
Разработчики остались довольны результатом. Единственная проблема, с которой пока не удалось справиться, — увеличившееся время сборки.
#typescript #migration
https://developer.chrome.com/blog/migrating-to-typescript/
Кодовой базе Chrome DevTools уже более 10 лет. За это время она выросла до 150 тысяч строк кода и пережила несколько больших изменений. Например, в 2013 году в ней стал использоваться Closure Compiler в качестве тайпчекера. Но в 2019 году было решено отказаться от Closure в пользу TypeScript, так как Closure не обеспечивал должный уровень типобезопасности.
Автоматизировать миграцию не получилось, поэтому весь процесс занял 13 месяцев. Для распараллеливания работы между инженерами во все файлы был добавлен
@ts-nocheck
; процесс тайпскрификации заключался в постепенном удалении этих директив.Разработчики остались довольны результатом. Единственная проблема, с которой пока не удалось справиться, — увеличившееся время сборки.
#typescript #migration
https://developer.chrome.com/blog/migrating-to-typescript/
Chrome for Developers
DevTools architecture refresh: migrating DevTools to TypeScript | Blog | Chrome for Developers
How we migrate Chrome DevTools from the Closure Compiler type checker to TypeScript.
Недавно на сайте документации Microsoft был опубликован курс, посвящённый разработке на TypeScript, — "Build JavaScript applications using TypeScript".
Курс бесплатный, нужно только зарегистрироваться для сохранения прогресса обучения. Обучение разбито на модули: введение, работа с переменными, функциями, интерфейсами, классами, использование дженериков, работа с внешними библиотеками, организация кода с помощью неймспейсов. Есть перевод на русский язык (очень похоже, что это машинный перевод).
В общем, выглядит интересно. Каких-то хардкорных вещей нет, так что подойдёт всем, кто только начинает знакомиться с TypeScript. Требуется только базовое знание JS и HTML.
#typescript
https://docs.microsoft.com/en-us/learn/paths/build-javascript-applications-typescript/
Курс бесплатный, нужно только зарегистрироваться для сохранения прогресса обучения. Обучение разбито на модули: введение, работа с переменными, функциями, интерфейсами, классами, использование дженериков, работа с внешними библиотеками, организация кода с помощью неймспейсов. Есть перевод на русский язык (очень похоже, что это машинный перевод).
В общем, выглядит интересно. Каких-то хардкорных вещей нет, так что подойдёт всем, кто только начинает знакомиться с TypeScript. Требуется только базовое знание JS и HTML.
#typescript
https://docs.microsoft.com/en-us/learn/paths/build-javascript-applications-typescript/
www.typescriptlang.org
JavaScript With Syntax For Types.
TypeScript extends JavaScript by adding types to the language. TypeScript speeds up your development experience by catching errors and providing fixes before you even run your code.
Крис Хагер написал руководство по настройке TypeScript-проекта — "Starting a TypeScript Project in 2021".
Руководство рассказывает про настройку сборки (используя esbuild), линтинга (eslint), тестов (jest), адаптацию Node.js для бесшовной работы с TypeScript (ts-node). Немного затрагивается тема настройки CI (GitHub Actions/GitLab CI) и генерации документации (TypeDoc).
В руководстве предлагается использовать esbuild, и это очень хороший совет. Однако стоит учитывать, что на данный момент поддержка код-сплиттинга в esbuild находится в экспериментальном статусе, поэтому для больших проектов (по крайней мере пока) лучше брать Webpack или Rollup.
#typescript
https://www.metachris.com/2021/04/starting-a-typescript-project-in-2021/
Руководство рассказывает про настройку сборки (используя esbuild), линтинга (eslint), тестов (jest), адаптацию Node.js для бесшовной работы с TypeScript (ts-node). Немного затрагивается тема настройки CI (GitHub Actions/GitLab CI) и генерации документации (TypeDoc).
В руководстве предлагается использовать esbuild, и это очень хороший совет. Однако стоит учитывать, что на данный момент поддержка код-сплиттинга в esbuild находится в экспериментальном статусе, поэтому для больших проектов (по крайней мере пока) лучше брать Webpack или Rollup.
#typescript
https://www.metachris.com/2021/04/starting-a-typescript-project-in-2021/
Metachris
Starting a TypeScript Project in 2021
This is a guide for starting a TypeScript project in 2021 with modern tooling.
TypeScript 4
Optionally esbuild to bundle for browsers (and Node.js)
Linting with typescript-eslint (tslint is deprecated)
Testing with Jest (and ts-jest)
Publishing a package…
TypeScript 4
Optionally esbuild to bundle for browsers (and Node.js)
Linting with typescript-eslint (tslint is deprecated)
Testing with Jest (and ts-jest)
Publishing a package…
Дэн Вандеркам рассказал о ситуациях, в которых система типов TypeScript проявляет свою ненадёжность (unsoudness) — "The Seven Sources of Unsoundness in TypeScript".
Надёжная система типов гарантирует соответствие статических типов в коде программы фактическим типам на этапе её выполнения. В TypeScript система типов ненадёжна. Более того разработчики языка осознанно не преследуют цель создания надёжной системы типов, потому что это противоречит более важной цели — максимально поддержать паттерны и подходы, используемые в JavaScript. Поэтому при использовании TypeScript нужно учитывать потенциальные проблемы, чтобы код не взорвался в продакшене.
Самые главные источники ненадёжности — это использование any, type assertions, получение значений из объектов и массивов, неправильные определения типов библиотек, вариантность при работе с массивами, отсутствие инвалидации уточнения типов после вызова функции и рекурсивные типы.
Очень хорошая статья. Рекомендую почитать всем, кто использует TypeScript.
#typescript
https://effectivetypescript.com/2021/05/06/unsoundness/
Надёжная система типов гарантирует соответствие статических типов в коде программы фактическим типам на этапе её выполнения. В TypeScript система типов ненадёжна. Более того разработчики языка осознанно не преследуют цель создания надёжной системы типов, потому что это противоречит более важной цели — максимально поддержать паттерны и подходы, используемые в JavaScript. Поэтому при использовании TypeScript нужно учитывать потенциальные проблемы, чтобы код не взорвался в продакшене.
Самые главные источники ненадёжности — это использование any, type assertions, получение значений из объектов и массивов, неправильные определения типов библиотек, вариантность при работе с массивами, отсутствие инвалидации уточнения типов после вызова функции и рекурсивные типы.
Очень хорошая статья. Рекомендую почитать всем, кто использует TypeScript.
#typescript
https://effectivetypescript.com/2021/05/06/unsoundness/
Effectivetypescript
Effective TypeScript › The Seven Sources of Unsoundness in TypeScript
Hang out on the internet much and you'll hear gripes about how TypeScript isn't "sound," and that this makes it a poor choice of language. In this post, I'll explain what this means and walk through the sources of unsoundness in TypeScript. Rest assured,…
Вчера зарелизился TypeScript 4.3. Дениэл Розенвассер рассказал о всех фичах новой версии.
Улучшена работа с сеттерами и геттерами. Теперь возможно указывать разные типы для чтения/записи свойств классов и объектов (separate write types).
Для решения проблем со случайным переопределением членов родительского класса теперь можно использовать ключевое слово
Улучшен вывод строковых шаблонных типов при использовании шаблонных строк и типов-параметров в дженериках.
Было оптимизировано время первой сборки приложений, использующих опции
Добавлена реализация приватных полей классов из ECMAScript. Улучшено сужение типов (type-narrowing) при работе с дженериками, Хелпер
#typescript #release
https://devblogs.microsoft.com/typescript/announcing-typescript-4-3/
Улучшена работа с сеттерами и геттерами. Теперь возможно указывать разные типы для чтения/записи свойств классов и объектов (separate write types).
Для решения проблем со случайным переопределением членов родительского класса теперь можно использовать ключевое слово
override
и флаг компиляции --noImplicitOverride
.Улучшен вывод строковых шаблонных типов при использовании шаблонных строк и типов-параметров в дженериках.
Было оптимизировано время первой сборки приложений, использующих опции
--incremental
и --watch
, за счёт ленивого вычисления необходимых данных. Добавлена реализация приватных полей классов из ECMAScript. Улучшено сужение типов (type-narrowing) при работе с дженериками, Хелпер
ConstructorParameters
теперь можно использовать с абстрактными классами. С включённой опцией strictNullChecks
теперь нельзя использовать промисы без await внутри условий. Улучшен механизм автодополнения импортов.#typescript #release
https://devblogs.microsoft.com/typescript/announcing-typescript-4-3/
Microsoft News
Announcing TypeScript 4.3
Today we’re excited to announce the availability of TypeScript 4.3! If you’re not yet familiar with TypeScript, it’s a language that builds on JavaScript by adding syntax for static types. Tools like the TypeScript compiler can just erase TypeScript syntax…
Как Google Closure Compiler помог в разработке TypeScript
Люк Хобан рассказал об истории появления TypeScript — "The first TypeScript demo".
В 2010 году команда разработки Office задумалась об экспансии в веб. Разработчики хотели использовать типизацию и средства для улучшения эргономики разработки, но подходящих инструментов не было.
Стив Люко увидел потребность в новом инструменте и начал работать над Strada (первое название TypeScript). Через некоторое время к нему присоединился Люк Хобан, он помог в разработке парсера. Они хотели успеть сделать полноценный прототип к началу внутренней конференции, но не успевали, так как Стив повредил кисть. Нужно было написать тайпчекер. Люк придумал хак. Они изменили компилятор так, чтобы JavaScript генерировался с аннотациями типов для Google Closure Compiler. Этот код отправлялся в веб-версию компилятора на сервера Google для проверки типов. Демка заработала, в проект поверили, и затем появилась первая версия TypeScript.
Очень интересная статья. Рекомендую почитать.
#typescript #history
https://medium.com/hackernoon/the-first-typescript-demo-905ea095a70f
Люк Хобан рассказал об истории появления TypeScript — "The first TypeScript demo".
В 2010 году команда разработки Office задумалась об экспансии в веб. Разработчики хотели использовать типизацию и средства для улучшения эргономики разработки, но подходящих инструментов не было.
Стив Люко увидел потребность в новом инструменте и начал работать над Strada (первое название TypeScript). Через некоторое время к нему присоединился Люк Хобан, он помог в разработке парсера. Они хотели успеть сделать полноценный прототип к началу внутренней конференции, но не успевали, так как Стив повредил кисть. Нужно было написать тайпчекер. Люк придумал хак. Они изменили компилятор так, чтобы JavaScript генерировался с аннотациями типов для Google Closure Compiler. Этот код отправлялся в веб-версию компилятора на сервера Google для проверки типов. Демка заработала, в проект поверили, и затем появилась первая версия TypeScript.
Очень интересная статья. Рекомендую почитать.
#typescript #history
https://medium.com/hackernoon/the-first-typescript-demo-905ea095a70f
Medium
The first TypeScript demo
Last week was the 5th anniversary of the launch of TypeScript, and I had the opportunity to go back to visit Anders and the team for the…
Типизация API с помощью кодогенерации TypeScript
Нэйт Андерсон написал статью про использование кодогенерации для покрытия типами нестандартных API — "TypeScript Compiler API: Improve API Integrations Using Code Generation".
В статье рассказывается о том, как автоматически сгенерировать типы из XML-декларации SOAP-сервиса. Для этого используется TypeScript API, с помощью которого можно программно создать любой корректный TypeScript-код.
Логика преобразования SOAP-типов в TypeScript-типы выглядит так. Декларация SOAP-сервиса парсится и из неё вычленяются входные и выходные типы и преобразуются в TypeScript-типы. Получившиеся типы используются для кодогенереации типов всех методов сервиса.
Хорошая статья. Рекомендую почитать всем, кто пишет на TypeScript.
#typescript
https://blog.appsignal.com/2021/08/18/improve-api-integrations-using-code-generation.html
Нэйт Андерсон написал статью про использование кодогенерации для покрытия типами нестандартных API — "TypeScript Compiler API: Improve API Integrations Using Code Generation".
В статье рассказывается о том, как автоматически сгенерировать типы из XML-декларации SOAP-сервиса. Для этого используется TypeScript API, с помощью которого можно программно создать любой корректный TypeScript-код.
Логика преобразования SOAP-типов в TypeScript-типы выглядит так. Декларация SOAP-сервиса парсится и из неё вычленяются входные и выходные типы и преобразуются в TypeScript-типы. Получившиеся типы используются для кодогенереации типов всех методов сервиса.
Хорошая статья. Рекомендую почитать всем, кто пишет на TypeScript.
#typescript
https://blog.appsignal.com/2021/08/18/improve-api-integrations-using-code-generation.html
Appsignal
TypeScript Compiler API: Improve API Integrations Using Code Generation | AppSignal Blog
Find out how you can use code generation to improve your API integrations.
В каких случаях можно использовать any
Стэфан Баумгартнер поделился своими мыслями о том, в каких случаях можно использовать тип any в TypeScript — "TypeScript: In defense of any".
Хорошим тоном считается отказ от any, но в некоторых случаях это невозможно. Например, при постепенной миграции большой кодовой базы на TypeScript. В тех местах, где нужно "нахакать". Также any незаменим при использовании сторонних библиотек без типизации.
Во всех случаях использование any нужно контролировать. Этому может помочь опция
#typescript
https://fettblog.eu/typescript-any-is-ok/
Стэфан Баумгартнер поделился своими мыслями о том, в каких случаях можно использовать тип any в TypeScript — "TypeScript: In defense of any".
Хорошим тоном считается отказ от any, но в некоторых случаях это невозможно. Например, при постепенной миграции большой кодовой базы на TypeScript. В тех местах, где нужно "нахакать". Также any незаменим при использовании сторонних библиотек без типизации.
Во всех случаях использование any нужно контролировать. Этому может помочь опция
noImplicitAny
, которая обязывает разработчика указывать тип any явно.#typescript
https://fettblog.eu/typescript-any-is-ok/
fettblog.eu
TypeScript: In defense of any
A couple of days ago I found this beauty on the internet: Give up and use any. That’s a fantastic website, absolutely hilarious! It also shows how much TypeScript has grown in popularity. You have to have a certain reach to get critics to create websites…
Уменьшение размера npm-пакетов AWS SDK
Тривикрам Камат из Amazon написал статью про опыт уменьшения размера npm-пакетов — "How we halved the publish size of modular AWS SDK for JavaScript clients".
Тривикрам работает над JavaScript-версией AWS SDK, который используется в окружениях с жёсткими квотами, поэтому размер npm-пакетов играет важную роль. Для сокращения объёма устанавливаемого кода были удалены JSDoc-комментарии из JS- и d.ts-файлов, сгенерированных с помощью библиотеки
Благодаря удалению лишнего кода размер пакетов уменьшился на ~50%.
#npm #optimization #typescript
https://aws.amazon.com/blogs/developer/how-we-halved-the-publish-size-of-modular-aws-sdk-for-javascript-clients/
Тривикрам Камат из Amazon написал статью про опыт уменьшения размера npm-пакетов — "How we halved the publish size of modular AWS SDK for JavaScript clients".
Тривикрам работает над JavaScript-версией AWS SDK, который используется в окружениях с жёсткими квотами, поэтому размер npm-пакетов играет важную роль. Для сокращения объёма устанавливаемого кода были удалены JSDoc-комментарии из JS- и d.ts-файлов, сгенерированных с помощью библиотеки
downlevel-dts
для старых версий TypeScript. Был удалён исходный TypeScript-код и сорсмапы. Для удобства отладки запланирован релиз специальной дебаг-версии пакетов.Благодаря удалению лишнего кода размер пакетов уменьшился на ~50%.
#npm #optimization #typescript
https://aws.amazon.com/blogs/developer/how-we-halved-the-publish-size-of-modular-aws-sdk-for-javascript-clients/
Amazon
How we halved the publish size of modular AWS SDK for JavaScript clients | Amazon Web Services
On December 15th, 2020, we announced the general availability of the AWS SDK for JavaScript, version 3 (v3). In v3, the modular packages reduce the bundle size of your application by ~75% as compared to that in AWS SDK for JavaScript, version 2 (v2). However…
Релиз TypeScript 4.5
Сегодня вышел TypeScript 4.5. Дениэл Розенвассер рассказал о всех новинках релиза.
Был добавлен новый утилитарный тип
С версии 4.5 встроенные типы можно обновлять отдельно от компилятора. Также теперь можно оверрайдить встроенные типы, используя пакеты
Строковые шаблонные типы могут использоваться в качестве дискрименантов в union'ах. Эта фича будет полезна при типизации ответов API.
В условных типах появилась оптимизация хвостовой рекурсии, благодаря которой можно описывать типы, полагающиеся на большое число итераций. Например, с его помощью можно затипизировать полноценный утилитарный тип
Появилась возможность отключения удаления неиспользуемых импортов. Также в рамках этой фичи был добавлена поддержка модификатора
Реализованы пропозалы "Ergonomic Brand Checks" и "Import assertions".
Также в этой версии должна была появиться поддержка ESM для Node.js, но она была временно удалена из-за несовместимости с экосистемой и проблем в реализации.
#release #typescript
https://devblogs.microsoft.com/typescript/announcing-typescript-4-5/
Сегодня вышел TypeScript 4.5. Дениэл Розенвассер рассказал о всех новинках релиза.
Был добавлен новый утилитарный тип
Awaited
. Этот тип моделирует разворачивание промисов с помощью await
в async-функциях и метода .then()
у промисов. Awaited
теперь используется для типизации Promise.all
, улучшая вывод типов. С версии 4.5 встроенные типы можно обновлять отдельно от компилятора. Также теперь можно оверрайдить встроенные типы, используя пакеты
@typescript/lib-*
в node_modules
.Строковые шаблонные типы могут использоваться в качестве дискрименантов в union'ах. Эта фича будет полезна при типизации ответов API.
В условных типах появилась оптимизация хвостовой рекурсии, благодаря которой можно описывать типы, полагающиеся на большое число итераций. Например, с его помощью можно затипизировать полноценный утилитарный тип
TrimLeft
.Появилась возможность отключения удаления неиспользуемых импортов. Также в рамках этой фичи был добавлена поддержка модификатора
type
для импортируемых типов: import {someFunction, type BaseType} from "./module.js";
.Реализованы пропозалы "Ergonomic Brand Checks" и "Import assertions".
Также в этой версии должна была появиться поддержка ESM для Node.js, но она была временно удалена из-за несовместимости с экосистемой и проблем в реализации.
#release #typescript
https://devblogs.microsoft.com/typescript/announcing-typescript-4-5/
Microsoft News
Announcing TypeScript 4.5
Today we’re excited to announce the release of TypeScript 4.5! If you’re not yet familiar with TypeScript, it’s a language that builds on JavaScript by adding statically checked types. When you use static types, you can run the TypeScript compiler to check…
Неожиданное пересечение типов в TypeScript
Стэфан Баумгартнер рассказал, в каких случаях могут возникать неожиданные пересечения типов, и что с ними делать — "TypeScript: Unexpected intersections".
Неожиданное пересечение типов возникает при обновлении свойств объектов, если в качестве ключа используется переменная с объединением типов. В этом случае для ключа TypeScript будет использовать "наибольший общий делитель" в виде пересечения типов. В примере ниже таким "делителем" будет пересечение
Также неожиданное пересечение типов может возникнуть после деструктуризации объекта, так как деструктурированные свойства теряют связь с оригинальным типом.
Полезная статья. Рекомендую почитать всем, кто использует TypeScript.
#typescript
https://fettblog.eu/typescript-unexpected-intersections/
Стэфан Баумгартнер рассказал, в каких случаях могут возникать неожиданные пересечения типов, и что с ними делать — "TypeScript: Unexpected intersections".
Неожиданное пересечение типов возникает при обновлении свойств объектов, если в качестве ключа используется переменная с объединением типов. В этом случае для ключа TypeScript будет использовать "наибольший общий делитель" в виде пересечения типов. В примере ниже таким "делителем" будет пересечение
string & number
, то есть тип never
, из-за чего возникнет ошибка типизации:
interface Person {
age: number;
name: string;
}
function updatePersonByKey(
person: Person,
key: keyof Person,
value: Person[keyof Person]
) {
// тут будет ошибка типизации, так как
// key превратится в пересечение типов `string & number`
person[key] = value;
}
Также неожиданное пересечение типов может возникнуть после деструктуризации объекта, так как деструктурированные свойства теряют связь с оригинальным типом.
Полезная статья. Рекомендую почитать всем, кто использует TypeScript.
#typescript
https://fettblog.eu/typescript-unexpected-intersections/
fettblog.eu
TypeScript: Unexpected intersections
Sometimes when writing TypeScript, some of the things you’d usually do in JavaScript work a little different and cause some weird, and puzzling situations. Sometimes you just want to assign a value to an object property and get a weird error like “Type ‘string…