Menu

TypeScript và Python: so sánh kiểu, tốc độ và ứng dụng

TypeScript và Python đều là ngôn ngữ bậc cao có garbage collection, nhưng TypeScript kiểm tra kiểu trước khi code chạy, còn type hint của Python là tùy chọn và bị bỏ qua lúc chạy. So sánh song song về kiểu, runtime, tốc độ, hệ sinh thái và ứng dụng, với cùng một chương trình viết bằng cả hai.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

TypeScript và Python đều là ngôn ngữ bậc cao có garbage collection, hàm là first-class và hệ sinh thái package lớn. Khác biệt chính nằm ở kiểu: kiểu của TypeScript được trình biên dịch kiểm tra trước khi chương trình chạy, còn type hint của Python là chú thích tùy chọn mà trình thông dịch bỏ qua. Hai ngôn ngữ cũng chạy trên những engine khác nhau và thống trị những loại phần mềm khác nhau: TypeScript ở mảng web, Python ở mảng dữ liệu và viết script.

Đây là một chương trình nhỏ bằng TypeScript. Nhấn Chạy:

Đầu ra:

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

Cùng chương trình đó bằng Python, có type hint:

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

Cấu trúc khá giống nhau: một kiểu cho bản ghi, một hàm có tham số được khai báo kiểu, một danh sách giá trị. Khác biệt nhìn thấy được là cú pháp (dấu ngoặc nhọn và dấu chấm phẩy so với thụt lề), interface so với @dataclass, và arrow function với filter/reduce so với generator expression.

So sánh nhanh TypeScript và Python

TypeScriptPython
KiểuTĩnh, kiểm tra lúc biên dịch; kiểu bị xóa lúc chạyĐộng; type hint tùy chọn, không bắt buộc lúc chạy
Bộ kiểm tra kiểutsc, một phần của ngôn ngữCông cụ riêng: mypy, pyright và các công cụ khác
Chạy trênEngine JavaScript: trình duyệt, Node.js, Deno, BunCPython (trình thông dịch tiêu chuẩn), PyPy và các trình khác
Cách thực thiBiên dịch sang JavaScript, rồi engine biên dịch JITBytecode được thông dịch trong CPython
Khối lệnhDấu ngoặc nhọn { }Thụt lề
Sốnumber (số thực 64 bit) và bigintint (kích thước bất kỳ) và float
Xử lý đồng thờiMột luồng cho mỗi event loop, async/await; worker cho việc song songasyncio, thread, multiprocessing
Trình quản lý packagenpm, pnpm, Yarn, Bunpip, uv, Poetry
Mạnh nhất ởFront end web, back end Node.js, ứng dụng full-stackKhoa học dữ liệu, machine learning, viết script, tự động hóa, back end

Cú pháp đặt cạnh nhau

Nếu bạn biết type hint của Python, hầu hết chú thích kiểu của TypeScript đều có cách viết tương ứng:

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> hoặc Map<string, number>
tuple[int, str][number, string]
str | Nonestring | null hoặc string | undefined
Literal["asc", "desc"]"asc" | "desc"
Callable[[int], str](n: number) => string
TypedDictinterface hoặc type
@dataclassmột class, hoặc một interface cho dữ liệu thuần
Anyany
None, True, Falsenull (hoặc undefined), true, false
and, or, not&&, ||, !
f"Hello {name}"`Hello ${name}`

Kiểu tĩnh và type hint

Cả hai ngôn ngữ đều cho bạn viết cùng một chú thích, a: number hoặc a: int. Điều xảy ra sau đó thì khác nhau.

Trong TypeScript, trình biên dịch kiểm tra mọi lời gọi trước khi bất cứ thứ gì chạy. Một đối số sai sẽ chặn quá trình build:

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

Trong Python, type hint chỉ là metadata. Trình thông dịch vẫn chạy lời gọi và trả về một chuỗi:

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

Việc kiểm tra là một bước riêng, dùng công cụ như 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)

Vì vậy, kiểu trong Python được thiết kế theo hướng từng bước (gradual): code không có chú thích đơn giản là không được kiểm tra, và bạn thêm type hint ở những chỗ có ích. TypeScript cũng có thể lỏng lẻo (any tắt kiểm tra cho một giá trị), nhưng khi bật strict, vốn là mặc định, một tham số không có chú thích kiểu sẽ bị báo lỗi chứ không được bỏ qua.

Có một điểm chung: cả hai đều không kiểm tra kiểu khi chương trình đang chạy. TypeScript xóa kiểu, còn Python bỏ qua type hint. Dữ liệu đến lúc chạy, như JSON từ một API, cần được kiểm tra hợp lệ ở cả hai ngôn ngữ (các thư viện như Zod trong TypeScript và Pydantic trong Python làm việc này dựa trên một schema).

Số hoạt động khác nhau

TypeScript dùng số của JavaScript: number là giá trị số thực dấu phẩy động 64 bit cho cả số nguyên lẫn số thập phân, và bigint là kiểu riêng cho số nguyên lớn. Kiểu int của Python tự mở rộng đến kích thước bất kỳ.

Đầu ra:

0.30000000000000004
9007199254740992
3.5 3
1267650600228229401496703205376n

Python in ra 9007199254740993 cho 2**53 + 1, vì số nguyên của nó chính xác ở mọi kích thước, và Python có toán tử chia lấy phần nguyên riêng, 7 // 2, cho kết quả 3. TypeScript không có kiểu int; một số nguyên chỉ là một number không có phần thập phân.

Runtime và hiệu năng

TypeScript chạy dưới dạng JavaScript. V8 (trong Chrome và Node.js), JavaScriptCore (trong Safari và Bun) và SpiderMonkey (trong Firefox) biên dịch code chạy thường xuyên thành mã máy ngay khi chạy, nên các vòng lặp nặng trong TypeScript thường nhanh hơn nhiều so với cùng vòng lặp đó trong CPython, vốn thực thi bytecode.

Với nhiều chương trình, khoảng cách đó ít quan trọng hơn bạn nghĩ:

  • Các thư viện số học và machine learning của Python (NumPy, pandas, PyTorch) làm phần việc nặng bằng code C, C++ hoặc CUDA đã biên dịch, nên một chương trình Python gọi chúng không chạy các vòng lặp bên trong bằng Python.
  • Máy chủ web ở cả hai ngôn ngữ dành phần lớn thời gian để chờ cơ sở dữ liệu và mạng.

Cả hai ngôn ngữ đều dùng một luồng chính cho hầu hết code. TypeScript trên Node.js xử lý đồng thời bằng event loop và async/await, và dùng worker thread cho tác vụ CPU song song. Python có asyncio cho cùng kiểu xử lý đồng thời, cùng với thread và process.

Hệ sinh thái và ứng dụng

TypeScript là lựa chọn mặc định cho:

  • Front end web: React, Angular, Vue và Svelte đều hỗ trợ, và nó biên dịch ra JavaScript mà trình duyệt chạy.
  • Code máy chủ trên Node.js, Deno và Bun: API với Express, Fastify, NestJS hoặc Hono.
  • Ứng dụng full-stack mà máy chủ và trình duyệt dùng chung định nghĩa kiểu, như các dự án Next.js.
  • Công cụ phát triển, công cụ dòng lệnh và ứng dụng desktop với Electron.

Python là lựa chọn mặc định cho:

  • Phân tích và trực quan hóa dữ liệu (pandas, NumPy, Matplotlib, Jupyter notebook).
  • Machine learning và AI (PyTorch, scikit-learn, và hầu hết code huấn luyện mô hình).
  • Viết script và tự động hóa: xử lý tệp, quản trị hệ thống, code kết nối các thành phần.
  • Back end web với Django, Flask hoặc FastAPI.
  • Tính toán khoa học và giảng dạy.

Phát triển back end web là nơi hai ngôn ngữ giao nhau nhiều nhất. Các nhóm thường chọn theo phần còn lại của hệ thống: TypeScript để dùng chung code với front end TypeScript, Python để đặt cạnh code dữ liệu và ML.

Nên học ngôn ngữ nào?

  • Làm web? Học JavaScript, rồi đến TypeScript. Mọi thứ chạy trong trình duyệt cuối cùng đều là JavaScript, và TypeScript là cách phần lớn code front end chuyên nghiệp được viết.
  • Làm việc với dữ liệu, AI hoặc tự động hóa? Học Python. Các thư viện của nó trong những lĩnh vực này không có bản tương đương thực sự trong thế giới JavaScript.
  • Ngôn ngữ đầu tiên, chưa có mục tiêu cụ thể? Python có ít cú pháp hơn để học trước khi bạn viết được chương trình hữu ích. TypeScript thêm một hệ thống kiểu lên trên JavaScript, ban đầu là thứ phải học thêm, nhưng sẽ đáng giá khi chương trình lớn dần.

Nhiều lập trình viên dùng cả hai: Python cho dữ liệu và script, TypeScript cho code web của sản phẩm. Nếu bạn đã biết type hint của Python, chú thích kiểu của TypeScript sẽ trông quen thuộc; điểm mới là trình biên dịch bắt buộc tuân theo chúng theo mặc định, và runtime bên dưới là JavaScript.

Câu hỏi thường gặp

TypeScript có tốt hơn Python không?

Nói chung không ngôn ngữ nào tốt hơn; mỗi ngôn ngữ dẫn đầu ở một lĩnh vực khác nhau. TypeScript là lựa chọn tiêu chuẩn cho front end web và phổ biến cho máy chủ Node.js, và việc kiểm tra kiểu là một phần của quy trình làm việc thông thường. Python dẫn đầu về khoa học dữ liệu, machine learning, viết script và tự động hóa, đồng thời có type hint mà bạn có thể kiểm tra bằng các công cụ như mypy hoặc pyright.

TypeScript có chạy nhanh hơn Python không?

Với code nặng về CPU viết bằng chính ngôn ngữ đó, thường là có: TypeScript được biên dịch sang JavaScript, và các engine như V8 biên dịch JavaScript thành mã máy lúc chạy, còn trình thông dịch Python tiêu chuẩn, CPython, chạy bytecode. Các chương trình Python dành phần lớn thời gian trong thư viện viết bằng C (NumPy, pandas, PyTorch) không bị giới hạn bởi điều đó, và với máy chủ chủ yếu chờ mạng thì khác biệt thường nhỏ.

Python có kiểu tĩnh như TypeScript không?

Python có type hint tùy chọn (def add(a: int, b: int) -> int), nhưng trình thông dịch không bắt buộc tuân theo: add("2", "3") vẫn chạy và trả về "23". Một công cụ kiểm tra riêng như mypy hoặc pyright mới báo lỗi không khớp này. Trong TypeScript, kiểm tra kiểu là nhiệm vụ chính của trình biên dịch, và dự án thường được thiết lập để code có lỗi kiểu không build được.

Nên học TypeScript hay Python trước?

Hãy chọn theo thứ bạn muốn làm. Với trang web và ứng dụng web, hãy học JavaScript rồi đến TypeScript, vì trình duyệt chỉ chạy JavaScript. Với phân tích dữ liệu, machine learning, tự động hóa, hoặc một ngôn ngữ đầu tiên có rất ít cú pháp, hãy bắt đầu với Python. Các ý tưởng cốt lõi (biến, hàm, vòng lặp, đối tượng) đều dùng được ở cả hai.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu