Перейти к содержимому

TC39 Stage 0–4

TC39 — комитет ECMAScript; процесс Stage 0–4 определяет путь фичи от идеи до стандарта, и Senior-инженер должен понимать, какие риски несёт использование Stage 1–2 фич в production (история с decorators — наглядный пример).

// Стадии TC39 и их смысл:
// Stage 0: Strawperson — произвольная идея (нет требований)
// Stage 1: Proposal — определена проблема, есть champion в TC39
// ← только изучение, production ЗАПРЕЩЁН
// Stage 2: Draft — начальная спецификация на TC39-языке
// ← API может измениться (decorators: 2015–2023 итераций!)
// Stage 2.7: Spec complete — полная спецификация, тесты в progress
// Stage 3: Candidate — финальная спецификация, impl feedback
// ← браузеры начинают реализацию, стабильно для polyfill
// Stage 4: Finished — принято в стандарт, 2+ реализации
// ← включается в следующий ECMAScript ежегодный snapshot
// Годовой релиз: ES20XX = все Stage 4 proposals до января того года
// ES2024 = Temporal (Stage 4), Array.groupBy → Object.groupBy и др.
// Stage 3 proposals (2024–2025): можно с polyfill
// Temporal API (замена Date — Stage 3)
import { Temporal } from '@js-temporal/polyfill';
const now = Temporal.Now.plainDateTimeISO();
console.log(now.toString()); // '2025-04-27T10:30:00'
// Iterator helpers (Stage 3 → Stage 4 в ES2025)
const result = [1, 2, 3, 4, 5]
.values() // Iterator
.filter(x => x > 2) // LazyIterator — нет промежуточного массива!
.map(x => x * 2)
.toArray(); // [6, 8, 10]
// Decorator metadata (Stage 3)
@Injectable
class Service { }
// Старый @babel/plugin-proposal-decorators несовместим с новым стандартом!
// Риски при использовании Stage < 3
// Реальный пример: decorators (2015 → 2023)
// - 2015: Stage 1 proposal, Babel начал поддержку
// - Angular/MobX/TypeScript использовали early proposal
// - 2023: Stage 3 с ДРУГОЙ семантикой (define vs set semantics)
// - Весь экосистемный код сломался при переходе!
// Безопасная стратегия:
// Stage 0–1: только эксперименты, изолированные прототипы
// Stage 2: только если готовы к migration cost
// Stage 3: production с официальным polyfill (e.g. @js-temporal/polyfill)
// Stage 4: native, проверяйте target browsers через caniuse.com
// TypeScript: "target" (куда компилировать) vs "lib" (что типизировать)
// — это разные настройки! "lib": ["ES2025"] не означает компиляцию под ES2025

Итог: TC39 Stage — многолетний pipeline от идеи до стандарта; использование фич до Stage 3 несёт риск breaking changes; Stage 4 производственно стабильно, Stage 3 — только с официальным polyfill.