3 системы типов, которые не являются TypeScript
Сравните JSDoc + @ts-check, ReScript и Flow как альтернативы TypeScript для JavaScript: безопасность типов, сборка и актуальность.
TypeScript — это стандартный способ типизации JavaScript, но не единственный. Если вы когда-либо добавляли шаг сборки в небольшой проект ради нескольких аннотаций типов или наблюдали, как tsc медленно обходит крупную кодовую базу, вы, вероятно, задавались вопросом: существует ли более лёгкий способ получить типобезопасность? Существует, и не один.
Три наиболее серьёзных альтернативы TypeScript для типизации JavaScript в 2026 году — это JSDoc с // @ts-check, ReScript и Flow: первый обеспечивает проверку типов без шага сборки, второй даёт более строгие гарантии, чем TypeScript, а третий — устаревший инструмент, который стоит использовать лишь для поддержки существующего кода. Всё остальное, что обычно упоминается в обзорах «альтернатив TypeScript» (Deno, Dart, Kotlin/JS), является средой выполнения или кроссплатформенным языком, а не системой типов, надстроенной над JavaScript.
Это сравнительный обзор для разработчиков, которые уже знакомы с TypeScript и хотят получить чёткое изложение компромиссов: язык против инструмента проверки, наличие или отсутствие шага сборки, корректность типизации в сравнении с намеренно некорректной моделью TypeScript, а также актуальное состояние экосистемы.
Ключевые выводы
- JSDoc с
// @ts-checkпроверяет типы в обычных файлах.js, используя тот же языковой сервис TypeScript, без шага сборки и без файлов.ts— эта возможность доступна начиная с TypeScript 2.3. - ReScript — это отдельный язык, компилируемый в JavaScript, со звуковой, полностью выводимой, номинальной системой типов из семейства OCaml; настраивается через
rescript.json, а не через удалённыйbsconfig.json. - Flow и ReScript оба написаны на OCaml, однако внешнее распространение Flow резко сократилось, тогда как внутри Meta он по-прежнему используется в production.
- Выбирайте JSDoc для постепенной типизации без шага сборки; ReScript — для максимальной корректности типизации в новых проектах; Flow — фактически только для поддержки существующей кодовой базы на Flow.
Три реальные альтернативы TypeScript в 2026 году
Подлинная «система типов для JavaScript» либо проверяет типы в исходном коде JavaScript (инструмент проверки или слой аннотаций), либо компилирует типизированный язык в JavaScript. Под это определение подпадают JSDoc с @ts-check, ReScript и Flow. Deno (среда выполнения, которая умеет запускать TypeScript), Dart и Kotlin/JS (отдельные языки, использующие JavaScript как один из нескольких целевых форматов) сюда не относятся. Знать о них полезно, но они отвечают на другой вопрос.
Для контекста: по состоянию на середину 2026 года актуальным стабильным релизом является TypeScript 7.0. Он вышел 8 июля 2026 года в виде нативного порта компилятора на Go; по данным Microsoft, скорость полной сборки, как правило, в 8–12 раз выше, чем у TypeScript 6.0. TypeScript 6.0 был последним релизом на старой кодовой базе JavaScript; поведение проверки типов в 7.0 сохранено. Одна оговорка: в 7.0 пока нет стабильного программного API, поэтому поддержка проверки типов в шаблонах Vue, Svelte и Angular ожидается в TypeScript 7.1, который планируется примерно в октябре 2026 года. Это важно учитывать при разговоре о JSDoc ниже.
| Критерий | JSDoc + @ts-check | ReScript | Flow | TypeScript (базовый) |
|---|---|---|---|---|
| Что это | Аннотации, проверяемые языковым сервисом TS | Язык, компилируемый в JS | Статический инструмент проверки типов | Надмножество JS, компилируемое в JS |
| Шаг сборки | Не нужен; типы — это комментарии | Обязателен (.res → .js) | Не нужен в runtime; Babel удаляет типы | Обязателен |
| Корректность типизации | Та же некорректная структурная модель, что у TS | Звуковая, выводимая, номинальная | Строже TS, но не полностью звуковая | Намеренно некорректная, структурная |
| Экосистема в 2026 | Растёт; стандарт без шага сборки | Небольшая, но активная | Внешнее распространение сократилось; используется внутри Meta | Доминирующая |
| Когда использовать | Постепенная типизация, без инструментов | Максимальная корректность, новые проекты | Поддержка существующего кода на Flow |
JSDoc + @ts-check: система типов TypeScript без шага сборки
Discover how at OpenReplay.com.
Что это: Типизация на основе JSDoc позволяет аннотировать обычные файлы .js структурированными комментариями и проверять их с помощью того же движка, что и TypeScript, — языкового сервиса TypeScript. Это не следует путать с JSDoc как генератором документации; здесь аннотации управляют проверкой типов. В руководстве TypeScript описан флаг --checkJs, который сообщает об ошибках в файлах .js и доступен начиная с TypeScript 2.3.
Как внедрить: Добавьте один комментарий в начало файла или включите два флага в tsconfig для всего проекта. Документация VS Code по JavaScript описывает // @ts-check как способ проверить несколько файлов, не включая проверку повсеместно.
// @ts-check
/**
* @typedef {{ id: number, name: string }} User
*/
/**
* @param {User} user
* @returns {string}
*/
function greet(user) {
return `Hi, ${user.name}`;
}
Для всего проекта можно обойтись без комментария в каждом файле:
{
"compilerOptions": {
"allowJs": true,
"checkJs": true
}
}
Поскольку типы JSDoc — это стираемые комментарии, файл выполняется как стандартный JavaScript в любом браузере или среде выполнения без шага компиляции. Именно поэтому типизацию можно внедрять по одному файлу за раз. Компромисс: вы наследуете модель TypeScript в точности, включая её намеренную некорректность, а синтаксис аннотаций более многословен, чем в .ts. Важная оговорка для эпохи 7.0: Microsoft полностью переписала проверку типов JavaScript для TypeScript 7.0 и убрала поддержку нескольких редко используемых тегов — в частности, TypeScript 7.0 больше не распознаёт теги @enum и @constructor.
Когда выбирать: Вы хотите постепенно добавить типобезопасность в существующую кодовую базу JavaScript или в библиотеку, поставляемую в виде обычного JS, и не хотите усложнять процесс шагом сборки.
ReScript: звуковая, номинальная, полностью выводимая типизация
Что это: ReScript — это отдельный язык, компилируемый в JavaScript, а не слой аннотаций; его система типов унаследована от OCaml. Система типов TypeScript намеренно некорректна: она допускает некоторые ошибочные программы ради совместимости с семантикой выполнения JavaScript. Именно этот пробел закрывает ReScript: он полностью выводит типы и, по словам авторов проекта, не имеет any, магических типов и неожиданного undefined. В отличие от структурной типизации TypeScript, где любой объект подходящей формы удовлетворяет типу, записи и варианты ReScript являются номинальными: два структурно идентичных типа не взаимозаменяемы, если это явно не объявлено.
Как внедрить: Установите компилятор и настройте rescript.json — единственный обязательный файл конфигурации для проекта на ReScript (в версиях до ReScript 11 он назывался bsconfig.json). ReScript 12, выпущенный 25 ноября 2025 года, полностью прекращает поддержку bsconfig.json и по умолчанию использует ES-модули в качестве формата вывода.
{
"name": "my-app",
"sources": { "dir": "src", "subdirs": true },
"package-specs": { "module": "esmodule", "in-source": true },
"suffix": ".res.js"
}
Суффикс генерируемых JS-файлов можно выбрать произвольно; команда рекомендует .res.js или .res.mjs — именно их используют официальные шаблоны create-rescript-app. Минимальный модуль:
let add = (a: int, b: int): int => a + b
let result = add(1, 2)
Console.log(result)
Цена реальна: это другой язык с собственным синтаксисом, для использования JavaScript-библиотек нужно писать interop-привязки, а экосистема значительно меньше, чем у TypeScript. Тем не менее ReScript создавался с расчётом на постепенное внедрение: если вы когда-нибудь захотите вернуться к обычному JavaScript, достаточно удалить исходные файлы и оставить чистый JavaScript-вывод.
Когда выбирать: Новый проект, в котором вы хотите получить максимально возможные гарантии типизации и готовы взять на себя обязательство использовать язык, а не просто аннотации.
Flow: всё ещё существует, но в основном вытеснен
Что это: Flow — это инструмент статической проверки типов для JavaScript с открытым исходным кодом, созданный в Facebook/Meta и написанный на OCaml. Как и Flow, ReScript происходит из OCaml, однако сегодня они занимают противоположные позиции по распространённости. Flow — это инструмент проверки, а не язык: вы аннотируете файлы .js, помечаете их комментарием // @flow, а типы удаляются с помощью Babel во время сборки.
// @flow
function add(a: number, b: number): number {
return a + b;
}
Реальное положение дел в 2026 году: Flow по-прежнему используется в production внутри Meta на миллионах строк JavaScript и React-кода, однако его внешняя экосистема существенно сократилась: меньше определений типов для библиотек, меньше обучающих материалов и более скудная инструментальная поддержка, чем у TypeScript. В сообществе обсуждалась возможность миграции крупных проектов, связанных с Meta, с Flow на TypeScript, однако ни один первичный источник не подтверждает наличия конкретных планов. Старые сравнения, утверждающие, что у Flow «светлое будущее», следует считать устаревшими: импульс давно перешёл к TypeScript.
Когда выбирать: Реалистично — только при поддержке существующей кодовой базы на Flow. Для любого нового проекта два других варианта предпочтительнее.
Вывод: выбирайте инструмент под задачу
Используйте JSDoc с @ts-check, когда вам нужна постепенная типизация без какого-либо инструментария сборки и с полной совместимостью с обычным JavaScript. Это наименее используемый и наиболее практичный вариант: по сути, это собственный инструмент проверки TypeScript, направленный на файлы .js. Выбирайте ReScript, когда начинаете новый проект и хотите максимальной корректности типизации, принимая отдельный язык и interop-привязки как неизбежную плату. Оставляйте Flow только для поддержки кода, уже написанного на нём. Если вы хотите типобезопасность, не покидая JavaScript прямо сейчас, добавьте // @ts-check в один файл и посмотрите, какие ошибки появятся.
Часто задаваемые вопросы
Можно ли использовать проверку типов JSDoc без установки TypeScript в качестве зависимости?
Редакторы, такие как VS Code, поставляются со встроенным языковым сервисом TypeScript, поэтому добавление // @ts-check в файл .js даёт проверку типов без каких-либо npm install. Чтобы выполнить ту же проверку в командной строке или в CI, нужно установить пакет typescript и запустить tsc с включёнными флагами allowJs и checkJs. Сами типы остаются в комментариях JSDoc, поэтому в поставляемый JavaScript ничего не добавляется в любом случае.
В чём разница между структурной типизацией в TypeScript и номинальной типизацией в ReScript?
Структурная типизация, используемая в TypeScript, считает любой объект подходящей формы удовлетворяющим типу, поэтому два несвязанных типа с одинаковыми полями взаимозаменяемы. Записи и варианты ReScript являются номинальными: два структурно идентичных типа считаются различными, если вы явно не объявите связь между ними. Номинальная типизация предотвращает случайную подстановку похожих типов — именно это делает систему типов ReScript звуковой там, где TypeScript намеренно некорректен.
Почему Deno не рассматривается как альтернатива TypeScript в этом сравнении?
Deno — это среда выполнения JavaScript и TypeScript, а не система типов, надстроенная над JavaScript. Он запускает TypeScript напрямую, встраивая компилятор TypeScript, то есть зависит от TypeScript, а не заменяет его. Подлинная альтернатива должна либо проверять типы в исходном коде JavaScript, либо компилировать типизированный язык в JavaScript. По той же причине из сравнения исключены Dart и Kotlin/JS — это отдельные языки, использующие JavaScript как один из нескольких целевых форматов компиляции.
Ломает ли переход на TypeScript 7.0 существующие JavaScript-проекты с типизацией через JSDoc?
В основном нет, однако TypeScript 7.0 на основе Go полностью переписал проверку типов JavaScript и убрал поддержку нескольких редко используемых тегов JSDoc — в частности, @enum и @constructor, которые 7.0 больше не распознаёт. Проекты, использующие эти теги, нужно перевести на поддерживаемые конструкции. Распространённые теги — @param, @returns, @typedef и @template — продолжают работать, поэтому большинство кодовых баз с JSDoc-типизацией переходят без изменений. TypeScript 7.0 является стабильным релизом с июля 2026 года; запустите ваш проект с ним, чтобы увидеть конкретные отличия.
Complete picture for complete understanding
Capture every clue your frontend is leaving so you can instantly get to the root cause of any issue with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data.
Star on GitHub12k