Menu

TypeScript vs Python: typowanie, szybkość i zastosowania

TypeScript i Python to języki wysokiego poziomu z garbage collectorem, ale TypeScript sprawdza typy przed uruchomieniem kodu, a type hints w Pythonie są opcjonalne i ignorowane w czasie wykonania. Porównanie typowania, środowiska uruchomieniowego, szybkości, ekosystemów i zastosowań, z tym samym programem w obu językach.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

TypeScript i Python to języki wysokiego poziomu z garbage collectorem, funkcjami jako wartościami pierwszej klasy i dużymi ekosystemami pakietów. Główna różnica to typowanie: typy w TypeScript sprawdza kompilator przed uruchomieniem programu, a type hints w Pythonie to opcjonalne adnotacje, które interpreter ignoruje. Oba działają też na innych silnikach i dominują w innych rodzajach oprogramowania: TypeScript w webie, Python w pracy z danymi i skryptach.

Oto mały program w TypeScript. Kliknij Run:

Wynik:

162.25
[ 'Ada', 'Grace', 'Linus' ]

Ten sam program w Pythonie, z type hints:

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']

Kształt jest podobny: typ dla rekordu, funkcja z otypowanymi parametrami, lista wartości. Widoczne różnice to składnia (nawiasy klamrowe i średniki kontra wcięcia), interface kontra @dataclass oraz funkcje strzałkowe z filter/reduce kontra wyrażenie generatora.

TypeScript vs Python w skrócie

TypeScriptPython
TypowanieStatyczne, sprawdzane w czasie kompilacji, typy usuwane w czasie wykonaniaDynamiczne, opcjonalne type hints, nieegzekwowane w czasie wykonania
Sprawdzanie typówtsc, część językaOsobne narzędzia: mypy, pyright i inne
Działa naSilnikach JavaScriptu: przeglądarki, Node.js, Deno, BunCPython (standardowy interpreter), PyPy i inne
WykonanieKompilacja do JavaScriptu, potem kompilacja JIT w silnikuInterpretowany bytecode w CPython
BlokiNawiasy klamrowe { }Wcięcia
Liczbynumber (64-bitowa liczba zmiennoprzecinkowa) i bigintint (dowolny rozmiar) i float
WspółbieżnośćJeden wątek na pętlę zdarzeń, async/await, workery do pracy równoległejasyncio, wątki, multiprocessing
Menedżer pakietównpm, pnpm, Yarn, Bunpip, uv, Poetry
Najmocniejszy wFrontend, backend na Node.js, aplikacje full-stackData science, uczenie maszynowe, skrypty, automatyzacja, backend

Składnia obok siebie

Jeśli znasz type hints w Pythonie, większość adnotacji w TypeScript ma bezpośredni odpowiednik:

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> albo Map<string, number>
tuple[int, str][number, string]
str | Nonestring | null albo string | undefined
Literal["asc", "desc"]"asc" | "desc"
Callable[[int], str](n: number) => string
TypedDictinterface albo type
@dataclassclass albo interface dla zwykłych danych
Anyany
None, True, Falsenull (albo undefined), true, false
and, or, not&&, ||, !
f"Hello {name}"`Hello ${name}`

Typy statyczne a type hints

Oba języki pozwalają napisać tę samą adnotację, a: number albo a: int. To, co dzieje się dalej, jest różne.

W TypeScript kompilator sprawdza każde wywołanie, zanim cokolwiek się wykona. Zły argument zatrzymuje budowanie:

index.ts(7,17): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.

W Pythonie type hints to metadane. Interpreter wykonuje wywołanie i zwraca string:

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

Sprawdzanie to osobny krok z narzędziem takim jak 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)

Typowanie w Pythonie jest więc z założenia stopniowe: kod bez adnotacji po prostu nie jest sprawdzany, a type hints dodajesz tam, gdzie pomagają. TypeScript też może być luźny (any wyłącza sprawdzanie dla wartości), ale przy włączonym strict, co jest ustawieniem domyślnym, parametr bez adnotacji to błąd, a nie darmowa przepustka.

Jedno mają wspólne: żaden nie sprawdza typów podczas działania programu. TypeScript usuwa swoje typy, a Python ignoruje swoje type hints. Dane, które przychodzą w czasie wykonania, na przykład JSON z API, wymagają walidacji w obu językach (robią to na podstawie schematu biblioteki takie jak Zod w TypeScript i Pydantic w Pythonie).

Liczby zachowują się inaczej

TypeScript ma liczby z JavaScriptu: number to 64-bitowa wartość zmiennoprzecinkowa zarówno dla liczb całkowitych, jak i ułamków, a bigint to osobny typ dla dużych liczb całkowitych. int w Pythonie sam rośnie do dowolnego rozmiaru.

Wynik:

0.30000000000000004
9007199254740992
3.5 3
1267650600228229401496703205376n

Python wypisuje 9007199254740993 dla 2**53 + 1, bo jego liczby całkowite są dokładne przy każdym rozmiarze, i ma osobny operator dzielenia całkowitego, 7 // 2, który daje 3. W TypeScript nie ma typu int: liczba całkowita to number, który po prostu nie ma części ułamkowej.

Środowisko uruchomieniowe i wydajność

TypeScript działa jako JavaScript. V8 (w Chrome i Node.js), JavaScriptCore (w Safari i Bun) i SpiderMonkey (w Firefoksie) kompilują często wykonywany kod do kodu maszynowego w trakcie działania, więc ciasne pętle w TypeScript są zwykle dużo szybsze niż te same pętle w CPython, który wykonuje bytecode.

W wielu programach ta różnica znaczy mniej, niż się wydaje:

  • Biblioteki numeryczne i do uczenia maszynowego w Pythonie (NumPy, pandas, PyTorch) wykonują ciężką pracę w skompilowanym kodzie C, C++ albo CUDA, więc program w Pythonie, który je wywołuje, nie wykonuje swoich wewnętrznych pętli w Pythonie.
  • Serwery webowe w obu językach spędzają dużo czasu na czekaniu na bazy danych i sieć.

Oba języki używają jednego głównego wątku dla większości kodu. TypeScript w Node.js obsługuje współbieżność pętlą zdarzeń i async/await, a do równoległej pracy procesora używa worker threads. Python ma asyncio do tego samego stylu współbieżności oraz wątki i procesy.

Ekosystemy i zastosowania

TypeScript to domyślny wybór dla:

  • Frontendu: React, Angular, Vue i Svelte go obsługują, a kompiluje się do JavaScriptu, który uruchamiają przeglądarki.
  • Kodu serwerowego na Node.js, Deno i Bun: API z Express, Fastify, NestJS albo Hono.
  • Aplikacji full-stack, w których serwer i przeglądarka współdzielą definicje typów, na przykład projektów Next.js.
  • Narzędzi, programów wiersza poleceń i aplikacji desktopowych w Electronie.

Python to domyślny wybór dla:

  • Analizy i wizualizacji danych (pandas, NumPy, Matplotlib, notatniki Jupyter).
  • Uczenia maszynowego i AI (PyTorch, scikit-learn i większość kodu do trenowania modeli).
  • Skryptów i automatyzacji: przetwarzania plików, administracji systemami, kodu łączącego systemy.
  • Backendu webowego z Django, Flask albo FastAPI.
  • Obliczeń naukowych i nauczania.

Backend webowy to obszar, w którym zachodzą na siebie najbardziej. Zespoły często wybierają według reszty stosu: TypeScript, żeby współdzielić kod z frontendem w TypeScript, Python, żeby być blisko kodu danych i ML.

Którego języka się uczyć?

  • Budujesz dla webu? Naucz się JavaScriptu, a potem TypeScriptu. Wszystko, co działa w przeglądarce, to ostatecznie JavaScript, a w TypeScript pisze się większość profesjonalnego kodu frontendu.
  • Pracujesz z danymi, AI albo automatyzacją? Naucz się Pythona. Jego biblioteki w tych obszarach nie mają prawdziwych odpowiedników w świecie JavaScriptu.
  • Pierwszy język, bez określonego celu? Python ma mniej składni do nauczenia, zanim zaczniesz pisać przydatne programy. TypeScript dodaje system typów na JavaScript, co na początku jest dodatkowym materiałem, a opłaca się, gdy programy rosną.

Wielu programistów używa obu: Pythona do danych i skryptów, TypeScript do webowego kodu produktu. Jeśli znasz już type hints w Pythonie, adnotacje w TypeScript będą wyglądać znajomo. Nowe jest to, że kompilator domyślnie je egzekwuje, a pod spodem działa JavaScript.

Najczęściej zadawane pytania

Czy TypeScript jest lepszy od Pythona?

Żaden nie jest ogólnie lepszy, każdy prowadzi w innych obszarach. TypeScript to standardowy wybór dla frontendu stron i częsty wybór dla serwerów Node.js, a sprawdzanie typów jest wbudowane w zwykły sposób pracy. Python prowadzi w data science, uczeniu maszynowym, skryptach i automatyzacji i ma type hints, które można sprawdzać narzędziami takimi jak mypy albo pyright.

Czy TypeScript jest szybszy od Pythona?

Dla kodu obciążającego procesor, napisanego w samym języku, zwykle tak: TypeScript kompiluje się do JavaScriptu, który silniki takie jak V8 kompilują w czasie wykonania do kodu maszynowego, a standardowy interpreter Pythona, CPython, wykonuje bytecode. Programy w Pythonie, które spędzają czas w bibliotekach napisanych w C (NumPy, pandas, PyTorch), nie są tym ograniczone, a przy serwerach ograniczonych przez sieć różnica bywa niewielka.

Czy Python ma statyczne typowanie jak TypeScript?

Python ma opcjonalne type hints (def add(a: int, b: int) -> int), ale interpreter ich nie egzekwuje: add("2", "3") się wykonuje i zwraca "23". Niezgodność zgłasza osobne narzędzie, takie jak mypy albo pyright. W TypeScript sprawdzanie to główne zadanie kompilatora, a projekty zwykle są skonfigurowane tak, że kod z błędami typów się nie buduje.

Czego uczyć się najpierw: TypeScriptu czy Pythona?

Wybierz według tego, co chcesz budować. Dla stron i aplikacji webowych naucz się JavaScriptu, a potem TypeScriptu, bo przeglądarki uruchamiają tylko JavaScript. Do analizy danych, uczenia maszynowego, automatyzacji albo jako pierwszy język z bardzo małą ilością składni zacznij od Pythona. Podstawowe pojęcia (zmienne, funkcje, pętle, obiekty) przydadzą się w obu przypadkach.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ