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
| TypeScript | Python | |
|---|---|---|
| Typowanie | Statyczne, sprawdzane w czasie kompilacji, typy usuwane w czasie wykonania | Dynamiczne, opcjonalne type hints, nieegzekwowane w czasie wykonania |
| Sprawdzanie typów | tsc, część języka | Osobne narzędzia: mypy, pyright i inne |
| Działa na | Silnikach JavaScriptu: przeglądarki, Node.js, Deno, Bun | CPython (standardowy interpreter), PyPy i inne |
| Wykonanie | Kompilacja do JavaScriptu, potem kompilacja JIT w silniku | Interpretowany bytecode w CPython |
| Bloki | Nawiasy klamrowe { } | Wcięcia |
| Liczby | number (64-bitowa liczba zmiennoprzecinkowa) i bigint | int (dowolny rozmiar) i float |
| Współbieżność | Jeden wątek na pętlę zdarzeń, async/await, workery do pracy równoległej | asyncio, wątki, multiprocessing |
| Menedżer pakietów | npm, pnpm, Yarn, Bun | pip, uv, Poetry |
| Najmocniejszy w | Frontend, backend na Node.js, aplikacje full-stack | Data 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:
| 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> albo Map<string, number> |
tuple[int, str] | [number, string] |
str | None | string | null albo string | undefined |
Literal["asc", "desc"] | "asc" | "desc" |
Callable[[int], str] | (n: number) => string |
TypedDict | interface albo type |
@dataclass | class albo interface dla zwykłych danych |
Any | any |
None, True, False | null (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.