12k
All articles

3 системы типов, которые не являются TypeScript

Сравните JSDoc + @ts-check, ReScript и Flow как альтернативы TypeScript для JavaScript: безопасность типов, сборка и актуальность.

OpenReplay Team
OpenReplay Team
3 системы типов, которые не являются TypeScript

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-checkReScriptFlowTypeScript (базовый)
Что этоАннотации, проверяемые языковым сервисом TSЯзык, компилируемый в JSСтатический инструмент проверки типовНадмножество JS, компилируемое в JS
Шаг сборкиНе нужен; типы — это комментарииОбязателен (.res.js)Не нужен в runtime; Babel удаляет типыОбязателен
Корректность типизацииТа же некорректная структурная модель, что у TSЗвуковая, выводимая, номинальнаяСтроже TS, но не полностью звуковаяНамеренно некорректная, структурная
Экосистема в 2026Растёт; стандарт без шага сборкиНебольшая, но активнаяВнешнее распространение сократилось; используется внутри MetaДоминирующая
Когда использоватьПостепенная типизация, без инструментовМаксимальная корректность, новые проектыПоддержка существующего кода на Flow

JSDoc + @ts-check: система типов TypeScript без шага сборки

Что это: Типизация на основе 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 года; запустите ваш проект с ним, чтобы увидеть конкретные отличия.

Open-source session replay

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

We use cookies to improve your experience. By using our site, you accept cookies.