Menu

TypeScript или Python: типизация, скорость, где применять

TypeScript и Python оба высокоуровневые языки со сборкой мусора, но TypeScript проверяет типы до запуска кода, а подсказки типов в Python необязательны и игнорируются во время выполнения. Сравнение типизации, среды выполнения, скорости, экосистем и областей применения с одной и той же программой на обоих языках.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

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: краткое сравнение

TypeScriptPython
ТипизацияСтатическая, проверяется при компиляции; во время выполнения типы стёртыДинамическая; необязательные подсказки типов, во время выполнения не соблюдаются
Проверка типовtsc, часть языкаОтдельные инструменты: mypy, pyright и другие
Где работаетДвижки JavaScript: браузеры, Node.js, Deno, BunCPython (стандартный интерпретатор), PyPy и другие
ВыполнениеКомпилируется в JavaScript, затем JIT-компилируется движкомИнтерпретируемый байткод в CPython
БлокиФигурные скобки { }Отступы
Числаnumber (64-битное число с плавающей точкой) и bigintint (любого размера) и float
КонкурентностьОдин поток на цикл событий, async/await; воркеры для параллельной работыasyncio, потоки, мультипроцессинг
Пакетный менеджерnpm, pnpm, Yarn, Bunpip, uv, Poetry
Сильнее всего вВеб-фронтенд, бэкенд на Node.js, fullstack-приложенияData science, машинное обучение, скрипты, автоматизация, бэкенд

Синтаксис бок о бок

Если вы знаете подсказки типов Python, у большинства аннотаций TypeScript есть прямой аналог:

PythonTypeScript
count: int = 0let 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 | Nonestring | null или string | undefined
Literal["asc", "desc"]"asc" | "desc"
Callable[[int], str](n: number) => string
TypedDictinterface или type
@dataclassclass или interface для простых данных
Anyany
None, True, Falsenull (или 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. Основные идеи (переменные, функции, циклы, объекты) переносятся в любом случае.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ