TypeScript и Python оба высокоуровневые языки со сборкой мусора, функциями первого класса и большими экосистемами пакетов. Главное различие в типизации: типы TypeScript проверяет компилятор до запуска программы, а подсказки типов в Python это необязательные аннотации, которые интерпретатор игнорирует. Кроме того, они работают на разных движках и доминируют в разных видах ПО: TypeScript в вебе, Python в работе с данными и скриптах.
Вот небольшая программа на TypeScript. Нажмите Run:
Вывод:
162.25
[ 'Ada', 'Grace', 'Linus' ]
Та же программа на Python с подсказками типов:
from dataclasses import dataclass
@dataclass
class Order:
customer: str
amount: float
paid: bool
def total_paid(orders: list[Order]) -> float:
return sum(o.amount for o in orders if o.paid)
orders = [
Order("Ada", 120.0, True),
Order("Grace", 80.5, False),
Order("Linus", 42.25, True),
]
by_amount = [o.customer for o in sorted(orders, key=lambda o: o.amount, reverse=True)]
print(total_paid(orders))
print(by_amount)
162.25
['Ada', 'Grace', 'Linus']
Структура похожа: тип для записи, функция с типизированными параметрами, список значений. Видимые различия в синтаксисе (фигурные скобки и точки с запятой против отступов), interface против @dataclass и стрелочные функции с filter/reduce против выражения-генератора.
TypeScript и Python: краткое сравнение
| TypeScript | Python | |
|---|---|---|
| Типизация | Статическая, проверяется при компиляции; во время выполнения типы стёрты | Динамическая; необязательные подсказки типов, во время выполнения не соблюдаются |
| Проверка типов | tsc, часть языка | Отдельные инструменты: mypy, pyright и другие |
| Где работает | Движки JavaScript: браузеры, Node.js, Deno, Bun | CPython (стандартный интерпретатор), PyPy и другие |
| Выполнение | Компилируется в JavaScript, затем JIT-компилируется движком | Интерпретируемый байткод в CPython |
| Блоки | Фигурные скобки { } | Отступы |
| Числа | number (64-битное число с плавающей точкой) и bigint | int (любого размера) и float |
| Конкурентность | Один поток на цикл событий, async/await; воркеры для параллельной работы | asyncio, потоки, мультипроцессинг |
| Пакетный менеджер | npm, pnpm, Yarn, Bun | pip, uv, Poetry |
| Сильнее всего в | Веб-фронтенд, бэкенд на Node.js, fullstack-приложения | Data science, машинное обучение, скрипты, автоматизация, бэкенд |
Синтаксис бок о бок
Если вы знаете подсказки типов Python, у большинства аннотаций TypeScript есть прямой аналог:
| Python | TypeScript |
|---|---|
count: int = 0 | let count: number = 0; |
def add(a: int, b: int) -> int: | function add(a: number, b: number): number { |
lambda x: x * 2 | (x) => x * 2 |
list[str] | string[] |
dict[str, int] | Record<string, number> или Map<string, number> |
tuple[int, str] | [number, string] |
str | None | string | null или string | undefined |
Literal["asc", "desc"] | "asc" | "desc" |
Callable[[int], str] | (n: number) => string |
TypedDict | interface или type |
@dataclass | class или interface для простых данных |
Any | any |
None, True, False | null (или undefined), true, false |
and, or, not | &&, ||, ! |
f"Hello {name}" | `Hello ${name}` |
Статические типы и подсказки типов
Оба языка позволяют написать одну и ту же аннотацию, a: number или a: int. А дальше происходит разное.
В TypeScript компилятор проверяет каждый вызов до того, как что-либо запустится. Неверный аргумент останавливает сборку:
index.ts(7,17): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
В Python подсказки это метаданные. Интерпретатор выполняет вызов и возвращает строку:
def add(a: int, b: int) -> int:
return a + b
print(add(2, 3)) # 5
print(add("2", "3")) # 23, the hints are not enforced
Проверка это отдельный шаг с инструментом вроде mypy:
$ mypy hints.py
hints.py:6: error: Argument 1 to "add" has incompatible type "str"; expected "int" [arg-type]
hints.py:6: error: Argument 2 to "add" has incompatible type "str"; expected "int" [arg-type]
Found 2 errors in 1 file (checked 1 source file)
Поэтому типизация в Python постепенная по замыслу: неаннотированный код просто не проверяется, а подсказки добавляют там, где они помогают. TypeScript тоже может быть нестрогим (any отключает проверку для значения), но с включённым strict, а это значение по умолчанию, неаннотированный параметр считается ошибкой, а не свободным пропуском.
Общее у обоих языков одно: ни один не проверяет типы во время работы программы. TypeScript стирает свои типы, а Python игнорирует свои подсказки. Данные, приходящие во время выполнения, например JSON из API, в обоих языках нужно валидировать (это делают по схеме библиотеки вроде Zod в TypeScript и Pydantic в Python).
Числа ведут себя по-разному
В TypeScript числа из JavaScript: number это 64-битное число с плавающей точкой и для целых, и для дробных, а bigint это отдельный тип для больших целых. int в Python сам растёт до любого размера.
Вывод:
0.30000000000000004
9007199254740992
3.5 3
1267650600228229401496703205376n
Python печатает 9007199254740993 для 2**53 + 1, поскольку его целые числа точны при любом размере, и в нём есть отдельный оператор целочисленного деления 7 // 2, который даёт 3. В TypeScript нет типа int; целое число это просто number без дробной части.
Среда выполнения и производительность
TypeScript выполняется как JavaScript. V8 (в Chrome и Node.js), JavaScriptCore (в Safari и Bun) и SpiderMonkey (в Firefox) компилируют горячий код в машинный код прямо во время выполнения, поэтому плотные циклы на TypeScript обычно намного быстрее тех же циклов в CPython, который выполняет байткод.
Для многих программ этот разрыв значит меньше, чем кажется:
- Числовые библиотеки и библиотеки машинного обучения Python (NumPy, pandas, PyTorch) выполняют тяжёлую работу в скомпилированном коде на C, C++ или CUDA, так что программа на Python, которая их вызывает, крутит внутренние циклы не на Python.
- Веб-серверы на любом из языков значительную часть времени ждут базы данных и сеть.
Оба языка выполняют большую часть кода в одном основном потоке. TypeScript на Node.js обрабатывает конкурентность через цикл событий и async/await, а для параллельной вычислительной работы использует потоки-воркеры. В Python есть asyncio для того же стиля конкурентности, а также потоки и процессы.
Экосистемы и области применения
TypeScript выбирают по умолчанию для:
- Веб-фронтенда: React, Angular, Vue и Svelte поддерживают его, и он компилируется в JavaScript, который выполняют браузеры.
- Серверного кода на Node.js, Deno и Bun: API на Express, Fastify, NestJS или Hono.
- Fullstack-приложений, где сервер и браузер используют общие определения типов, например проектов на Next.js.
- Инструментов, утилит командной строки и десктопных приложений на Electron.
Python выбирают по умолчанию для:
- Анализа и визуализации данных (pandas, NumPy, Matplotlib, блокноты Jupyter).
- Машинного обучения и ИИ (PyTorch, scikit-learn и большая часть кода для обучения моделей).
- Скриптов и автоматизации: обработки файлов, системного администрирования, связующего кода.
- Веб-бэкенда на Django, Flask или FastAPI.
- Научных вычислений и обучения.
Больше всего они пересекаются в бэкенд-разработке. Команды часто выбирают по тому, что используется в остальном стеке: TypeScript, чтобы делиться кодом с фронтендом на TypeScript, Python, чтобы быть рядом с кодом для данных и ML.
Что учить?
- Разрабатываете для веба? Изучите JavaScript, затем TypeScript. Всё, что работает в браузере, в итоге является JavaScript, а TypeScript это то, на чём пишется большая часть профессионального фронтенд-кода.
- Работаете с данными, ИИ или автоматизацией? Изучите Python. У его библиотек в этих областях нет настоящих аналогов в мире JavaScript.
- Первый язык без чёткой цели? В Python меньше синтаксиса, который нужно выучить, прежде чем писать полезные программы. TypeScript добавляет систему типов поверх JavaScript: поначалу это лишний материал, но он окупается по мере роста программ.
Многие разработчики используют оба: Python для данных и скриптов, TypeScript для веб-кода продукта. Если вы уже знаете подсказки типов Python, аннотации TypeScript покажутся знакомыми; новое в том, что компилятор по умолчанию их соблюдает, а в основе лежит среда выполнения JavaScript.
Часто задаваемые вопросы
TypeScript лучше, чем Python?
В целом ни один не лучше; они лидируют в разных областях. TypeScript это стандартный выбор для веб-фронтенда и частый выбор для серверов на Node.js, и проверка типов встроена в обычный процесс работы. Python лидирует в data science, машинном обучении, скриптах и автоматизации, а его подсказки типов можно проверять инструментами вроде mypy или pyright.
TypeScript быстрее, чем Python?
Для вычислительного кода, написанного на самом языке, обычно да: TypeScript компилируется в JavaScript, который движки вроде V8 во время выполнения компилируют в машинный код, а стандартный интерпретатор Python, CPython, выполняет байткод. Программы на Python, которые проводят время в библиотеках на C (NumPy, pandas, PyTorch), этим не ограничены, а для серверов, упирающихся в сеть, разница часто невелика.
Есть ли в Python статическая типизация, как в TypeScript?
В Python есть необязательные подсказки типов (def add(a: int, b: int) -> int), но интерпретатор их не соблюдает: add("2", "3") выполняется и возвращает "23". О несоответствии сообщает отдельный инструмент вроде mypy или pyright. В TypeScript проверка это главная задача компилятора, и проекты обычно настроены так, что код с ошибками типов не собирается.
Что учить первым: TypeScript или Python?
Выбирайте по тому, что хотите создавать. Для сайтов и веб-приложений изучите JavaScript, затем TypeScript, ведь браузеры выполняют только JavaScript. Для анализа данных, машинного обучения, автоматизации или как первый язык с минимумом синтаксиса начните с Python. Основные идеи (переменные, функции, циклы, объекты) переносятся в любом случае.