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