Почему я не буду писать свою следующую библиотеку на TypeScript
Валентин Ульянов
04.2025
Почему я не буду писать свою следующую библиотеку на TypeScript
Валентин Ульянов
Обо мне
В IT около 10 лет
Делаю инструменты и редакторы документов, типа Word и Excel
Обо мне
В IT около 10 лет
Делаю инструменты и редакторы документов, типа Word и Excel
Разрабатываю open source проект
Atomic CSS toolkit with Sass and ergonomics for creating styles of any complexity
Обо мне
В IT около 10 лет
Делаю инструменты и редакторы документов, типа Word и Excel
Разрабатываю open source проект
Выступаю на конференциях и веду IT-сообщество в Питере на 600+ человек
Я и JavaScript/TypeScript
Первый опыт с JS был в 2013
Я и JavaScript/TypeScript
Первый опыт с JS был в 2013
С 2022 до 2025 в основном писал на TS
Я и JavaScript/TypeScript
Первый опыт с JS был в 2013
С 2022 до 2025 в основном писал на TS
Сделал несколько библиотек на TS
Я и JavaScript/TypeScript
Первый опыт с JS был в 2013
С 2022 до 2025 в основном писал на TS
Сделал несколько библиотек на TS
Сейчас работаю с проектом на 1 500 000 строк кода
Содержание
Трезвый взгляд на TypeScript
Причины не писать на TypeScript
Что делать?
Заключение
Системный код - код, который нужен для работы другого кода. Библиотеки, фреймворки, утилиты, etc
Системный код - код, который нужен для работы другого кода. Библиотеки, фреймворки, утилиты, etc
Прикладной код - программа для решения задач предметной области. Сервис доставки, интернет-магазин, онлайн-банк, etc
Трезвый взгляд на TypeScript
67% of respondents stated they write more TypeScript than JavaScript code – while the single largest group consisted of people who only write TypeScript.
State of JS
Источник
Мастера, которые пишут на JS
Matteo Collina : Node.js, Fastify, Pino
Мастера, которые пишут на JS
Matteo Collina : Node.js, Fastify, Pino
Rich Harris : Rollup, Svelte
Мастера, которые пишут на JS
Matteo Collina : Node.js, Fastify, Pino
Rich Harris : Rollup, Svelte
Sindre Sorhus : половина npm
Мастера, которые пишут на JS
Matteo Collina : Node.js, Fastify, Pino
Rich Harris : Rollup, Svelte
Sindre Sorhus : половина npm
Тимур Шемсединов : Metarhia
TypeScript - про надежность?
TypeScript - про надежность?
Soundness - свойство системы типов, при котором, скомпилированная программа гарантированно не имеет ошибок, связанных с типами данных
TypeScript - про надежность?
Soundness - свойство системы типов, при котором, скомпилированная программа гарантированно не имеет ошибок, связанных с типами данных
Unsound - антоним soundness
TypeScript - про надежность?
Soundness - свойство системы типов, при котором, скомпилированная программа гарантированно не имеет ошибок, связанных с типами данных
Unsound - антоним soundness
TypeScript повышает продуктивность?
Главные плюсы TypeScript
Контракты
Статический анализ
Главные плюсы TypeScript
Контракты
Статический анализ
Подсказки
Главные плюсы TypeScript
Контракты
Статический анализ
Подсказки
и другие возможности IDE
TypeScript - не только язык
TypeScript - не только язык
TypeScript - не только язык
Язык
Компилятор
Language server
TypeScript - не только язык
Язык
Компилятор
Language server
Типы стандартной библиотеки JS
TypeScript - не только язык
Язык
Компилятор
Language server
Типы стандартной библиотеки JS
А что если 🤔
Компоненты
Language server
Definition Types
А что если 🤔
Компоненты
Language server
Definition Types
Сильные стороны
Контракты
Статический анализ
Функционал IDE
Причины не писать на TypeScript
Структурная типизация
Совместимость типов определяется по их структуре, а не по имени или месту объявления
Вариантность типов
Сохранение совместимости присваивания исходных типов у производных от них типов
Вариантность типов
Сохранение совместимости присваивания исходных типов у производных от них типов
Возможность использовать надтип или подтип там, где используется исходный тип
Вариантность типов
Сохранение совместимости присваивания исходных типов у производных от них типов
Ковариантность - в прямом порядке
Вариантность типов
Сохранение совместимости присваивания исходных типов у производных от них типов
Ковариантность - в прямом порядке
Контрвариантность - в обратном порядке
Вариантность типов
Сохранение совместимости присваивания исходных типов у производных от них типов
Ковариантность - в прямом порядке
Контрвариантность - в обратном порядке
Вариантность типов
Сохранение совместимости присваивания исходных типов у производных от них типов
Ковариантность - в прямом порядке
Контрвариантность - в обратном порядке
Бивариативность - в обе стороны
Ограничения TS
Недостаточная выразитильность системы типов
Ограничения TS
Недостаточная выразитильность системы типов
Запрет на использование некоторых возможностей JS
Ограничения TS
Недостаточная выразитильность системы типов
Запрет на использование некоторых возможностей JS
Отсутствие возможности типизировать
Баги TS
Наличие этапа сборки
Нельзя установить пакет из ветки/коммита на гитхабе
Наличие этапа сборки
Нельзя установить пакет из ветки/коммита на гитхабе
Проблематично дебажить инструмент на проде и переносить фиксы
Резюме
Пишем 3х-этажные типы, либо @ts-expect-error
Резюме
Пишем 3х-этажные типы, либо @ts-expect-error
Не факт, что сможем типизировать код
Резюме
Пишем 3х-этажные типы, либо @ts-expect-error
Не факт, что сможем типизировать код
Часто типы не влияют на публичный API
Резюме
Пишем 3х-этажные типы, либо @ts-expect-error
Не факт, что сможем типизировать код
Часто типы не влияют на публичный API
Типы не дают никаких гарантий (unsound)
Language Server
npm i -D typescript
js config.json
Контракты и аннотации
.d.ts
JSDoc
.d.ts
+ JSDoc
.d.ts
Названия модулей должны совпадать
.d.ts
Названия модулей должны совпадать
Подцепляются сами
.d.ts
Названия модулей должны совпадать
Подцепляются сами
Можно использовать весь синтаксис TS
.d.ts
Названия модулей должны совпадать
Подцепляются сами
Можно использовать весь синтаксис TS
Из них можно импортировать типы в JS
JSDoc
Учитываются типы из аннотаций
JSDoc
Учитываются типы из аннотаций
Ограниченный набор аннотаций + TS-специфичные: @template
JSDoc
Учитываются типы из аннотаций
Ограниченный набор аннотаций + TS-специфичные: @template
Можно использовать синтаксис TS в аннотациях
JSDoc
Учитываются типы из аннотаций
Ограниченный набор аннотаций + TS-специфичные: @template
Можно использовать синтаксис TS в аннотациях
Можно импортировать типы
.d.ts
+ JSDoc
Продвинутые подсказки
Не загромождаем код типами
Тайпчекинг
"checkJs": true
в jsconfig.json
Тайпчекинг
"checkJs": true
в jsconfig.json
Опциональный
Тайпчекинг
"checkJs": true
в jsconfig.json
Опциональный
//@ts-nocheck
для сложных модулей
Что мы получили
Контракты
Статический анализ
Что мы получили
Контракты
Статический анализ
Функционал IDE в любом редакторе
Что мы получили
Контракты
Статический анализ
Функционал IDE в любом редакторе
Не требуется сборка
Альтернативный способ работы с TS
Альтернативный способ работы с TS
Пишем логику на JS
Пишем типы отдельно
Альтернативный способ работы с TS
Пишем логику на JS
Пишем типы отдельно
Опциональная проверка типов
Хорошо подойдет
Системный код
Существующий большой проект на JS
Подойдет хуже
Стандартный проект с нуля
Подойдет хуже
Стандартный проект с нуля
Участники команды разных уровней
Подойдет хуже
Стандартный проект с нуля
Участники команды разных уровней
Низкая инженерная культура
Выводы
Большинство может быть неправо в чем-то
Выводы
Большинство может быть неправо в чем-то
Ищите самых умных несогласных
Выводы
Большинство может быть неправо в чем-то
Ищите самых умных несогласных
Пробуйте смотреть на привычные вещи под другим углом
Вопросы?
Телеграм-канал: