TS vs JS — философия автора

автор рассматривает TypeScript как костыль над JavaScript, а не отдельный язык. Большие проекты пишутся на чистом JS + .d.ts файлы рядом, по образцу .h файлов в C++.

Что это / Зачем в TS

Это не учебный консенсус, а альтернативная позиция — основная для понимания всей его серии лекций про TS. Без этого фрейма непонятны его другие тезисы (про union, ORM, DTO, .d.ts).

Ключевые тезисы

1. TS — язык маленьких проектов

"TypeScript — это язык, на котором пишутся только маленькие проекты. Это типичный галерный API."

Большие проекты (Google Docs, YouTube, Facebook, Figma, Gmail) — на чистом JavaScript. Десятки миллионов строк.

2. TS — не строгое надмножество JS

"Вранье, что TypeScript это надмножество JavaScript."

Контрпример:

class A {
  constructor(s: string) { return s as any; } // валидный JS
}
const x = new A('hello'); // в JS x === 'hello' (string)
// TS считает x: A — и ошибается

Конструктор в JS по спеке может вернуть что угодно: null, undefined, promise, строку. TS моделирует только instance.

3. У TS плохой вывод типов

TS не может реализовать алгоритм Hindley-Milner (вывод из литералов и сигнатур) из-за особенностей JS.

4. TS не ускоряет код

Типы исчезают при компиляции в JS. Типы TS не совпадают с формами объектов в V8. Оптимизация V8 идёт через формы (hidden classes) и порядок ключей, чего TS не выражает.

5. На границе IPC TS бессилен

JSON.parse, fetch, БД, Kafka, Redis — на этих границах типы разрываются. Реальная защита — тесты + JSON Schema валидация.

Рекомендация: JS + .d.ts

"Подумайте о том, чтобы перейти на JavaScript плюс DTS-ники."

// units.js — реализация на чистом JS
export function bytesToSize(bytes) { /* ... */ }
// units.d.ts — контракт отдельно
export function bytesToSize(bytes: number): string;

Параллель: в C++ Delphi (Андерс Хейлсберг — автор обоих и TS) разделение .h/.cpp и .pas/.dfm — это норма. В TS Хейлсберг почему-то не принёс эту культуру разделения.

Аргументы "за" разделение

  • Контракт компактно.d.ts помещает весь API на один экран, без тел функций.
  • Когнитивная разгрузка — читая типы, не отвлекаешься на код.
  • Гибкость точности.d.ts может быть менее подробным, чем встроенный TS.
  • Не блокирует выполнение — JS работает без компиляции.

Тулинг

{
  "scripts": {
    "types": "tsc -p tsconfig.json --noEmit",
    "test": "eslint . && prettier --check . && tsc --noEmit && node --test"
  }
}

noEmit: true обязателен — иначе TS перезапишет ваш JS.

Почему люди выбирают TS

Социальная причина: бэкграунд из Java/C#/Delphi. Им чистый JS кажется "говном", а синтаксический мусор типов — привычным. Современные строго типизированные языки (Go, Rust) пишут типы с минимальной нотацией.

Альтернативы

  • Полный TS — стандарт у большинства команд, ок для небольших проектов.
  • JSDoc — типы в комментариях, без сборки. Автор утверждает менее удобным, чем .d.ts.
  • Flow — был глубже продуман, но проиграл TS.

🎓 Источники

  • 🎓 TypeScript vs JavaScript: как лучше писать типы · 2025-11-08 · YouTube
    • Позиция автора (provocative): TS — для маленьких проектов; для больших — JS + .d.ts.
  • 🎓 Я запрещаю UNION types в TypeScript и ORM · 2025-12-17 · YouTube
  • 🎓 JavaScript / TypeScript meme explained · 2025-12-05 · YouTube
    • Тезис: типы иногда прячут ошибку вместо того чтобы её показать.

См. также