TypeScriptとPythonは、どちらもガベージコレクション、第一級関数、大きなパッケージのエコシステムを持つ高水準言語です。一番の違いは型です。TypeScriptの型はプログラムの実行前にコンパイラーがチェックし、Pythonの型ヒントはインタープリターが無視する任意の注釈です。また、動くエンジンも違い、得意とするソフトウェアの種類も違います。TypeScriptはWeb、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 |
| 並行処理 | イベントループごとに1スレッド、async/await。並列処理にはワーカー | asyncio、スレッド、マルチプロセス |
| パッケージマネージャー | npm、pnpm、Yarn、Bun | pip、uv、Poetry |
| 得意分野 | Webフロントエンド、Node.jsのバックエンド、フルスタックアプリ | データサイエンス、機械学習、スクリプト、自動化、バックエンド |
構文の比較
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は型ヒントを無視します。APIから届くJSONのように実行時に入ってくるデータは、どちらの言語でも検証が必要です(TypeScriptのZodやPythonのPydanticのようなライブラリが、スキーマからこれを行います)。
数値の振る舞いが違う
TypeScriptの数値はJavaScriptの数値です。number は整数にも小数にも使う64ビットの浮動小数点数で、大きな整数には別の型 bigint があります。Pythonの int は、自動的にいくらでも大きくなります。
出力:
0.30000000000000004
9007199254740992
3.5 3
1267650600228229401496703205376n
Pythonでは整数がどんな大きさでも正確なので、2**53 + 1 は 9007199254740993 と表示されます。また、整数除算専用の演算子 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で実行していません。
- どちらの言語でも、Webサーバーは時間の多くをデータベースやネットワークの待ちに使います。
どちらの言語も、ほとんどのコードを1つのメインスレッドで動かします。Node.jsのTypeScriptはイベントループと async/await で並行処理を行い、CPUの並列処理にはワーカースレッドを使います。Pythonには同じスタイルの並行処理のための asyncio があり、さらにスレッドとプロセスも使えます。
エコシステムと用途
TypeScript が標準的に選ばれる分野:
- Webフロントエンド: React、Angular、Vue、Svelteはすべて対応していて、ブラウザーが実行するJavaScriptにコンパイルされます。
- Node.js、Deno、Bunのサーバーコード: Express、Fastify、NestJS、HonoによるAPI。
- Next.jsのプロジェクトのように、サーバーとブラウザーで型定義を共有するフルスタックアプリ。
- 開発ツール、コマンドラインツール、Electronのデスクトップアプリ。
Python が標準的に選ばれる分野:
- データ分析と可視化(pandas、NumPy、Matplotlib、Jupyter notebook)。
- 機械学習とAI(PyTorch、scikit-learn、そしてモデルの学習コードの大半)。
- スクリプトと自動化: ファイル処理、システム管理、つなぎのコード。
- Django、Flask、FastAPIによるWebバックエンド。
- 科学技術計算と教育。
最も重なるのはWebのバックエンド開発です。チームはスタックのほかの部分に合わせて選ぶことがよくあります。TypeScriptのフロントエンドとコードを共有するならTypeScript、データや機械学習のコードの隣に置くならPythonです。
どちらを学ぶべきか
- Web向けに作るなら: JavaScriptを学んでから、TypeScriptへ。ブラウザーで動くものは最終的にすべてJavaScriptで、プロのフロントエンドのコードの多くはTypeScriptで書かれています。
- データ、AI、自動化の仕事なら: Pythonを学びましょう。これらの分野のPythonのライブラリには、JavaScriptの世界に本当の意味での代わりがありません。
- 最初の言語で、決まった目的がないなら: Pythonのほうが、役に立つプログラムを書けるようになるまでに覚える構文が少なくて済みます。TypeScriptはJavaScriptの上に型システムを加えるので、最初は学ぶことが増えますが、プログラムが大きくなるにつれて効いてきます。
両方を使う開発者も多くいます。データとスクリプトにはPython、プロダクトのWebのコードにはTypeScriptです。Pythonの型ヒントを知っていれば、TypeScriptの型注釈は見慣れたものに見えるでしょう。新しいのは、デフォルトでコンパイラーがそれを強制することと、その下で動くランタイムがJavaScriptであることです。
よくある質問
TypeScriptはPythonより優れていますか?
一概にどちらが優れているとは言えず、得意な分野が違います。TypeScriptはWebフロントエンドの標準的な選択肢で、Node.jsのサーバーでもよく使われ、型チェックが普段の開発の流れに組み込まれています。Pythonはデータサイエンス、機械学習、スクリプト、自動化で主流で、mypyやpyrightなどのツールでチェックできる型ヒントがあります。
TypeScriptはPythonより速いですか?
言語そのもので書いたCPU負荷の高いコードなら、たいていは速いです。TypeScriptはJavaScriptにコンパイルされ、V8のようなエンジンが実行時にそれを機械語にコンパイルしますが、標準のPythonインタープリターであるCPythonはバイトコードを実行します。Cで書かれたライブラリ(NumPy、pandas、PyTorch)で時間を使うPythonのプログラムはその制約を受けず、ネットワーク待ちが中心のサーバーでは差が小さいこともよくあります。
PythonにはTypeScriptのような静的型付けがありますか?
Pythonには任意の型ヒント(def add(a: int, b: int) -> int)がありますが、インタープリターはそれを強制しません。add("2", "3") は実行されて "23" を返します。不一致を報告するのは、mypyやpyrightのような別のチェッカーです。TypeScriptでは型チェックがコンパイラーの主な仕事で、型エラーのあるコードはビルドされないようにプロジェクトを設定するのが普通です。
TypeScriptとPython、どちらを先に学ぶべきですか?
作りたいもので選びましょう。WebサイトやWebアプリなら、ブラウザーはJavaScriptしか実行しないので、JavaScriptを学んでからTypeScriptに進みます。データ分析、機械学習、自動化、あるいは構文の少ない最初の言語がほしいなら、Pythonから始めます。どちらを選んでも、基本的な考え方(変数、関数、ループ、オブジェクト)はもう一方に活かせます。