TypeScript là JavaScript có kiểu tĩnh. Bạn thêm chú thích kiểu (type annotation) cho biến, tham số và giá trị trả về, trình biên dịch TypeScript kiểm tra chúng trước khi chương trình chạy, rồi xuất ra JavaScript thuần đã bỏ hết kiểu. Đoạn JavaScript đó chạy được ở mọi nơi JavaScript chạy: trình duyệt, Node.js, Deno và Bun.
Đây là một chương trình TypeScript nhỏ. Nhấn Chạy.
Đầu ra:
Ada is 36 years old
82.33333333333333
Ngoài những phần sau dấu hai chấm (: string, : User, : number[]) và interface, đây là JavaScript. Các phần thêm vào đó cho trình biên dịch biết mỗi giá trị được phép là gì. Để ý rằng total không có chú thích kiểu: TypeScript tự suy ra nó là một số. Phần lớn code TypeScript chỉ chú thích kiểu ở ranh giới của hàm và để trình biên dịch suy luận phần còn lại.
Bộ kiểm tra kiểu bắt được những lỗi gì
Mục đích của chú thích kiểu là để lỗi lộ ra ngay khi bạn đang viết code, thay vì khi người dùng gặp phải. Chạy khối code này và đọc đầu ra:
Chương trình không hề chạy. Thay vào đó, trình biên dịch in ra hai lỗi:
index.ts(11,38): error TS2322: Type 'string' is not assignable to type 'number'.
index.ts(12,22): error TS2741: Property 'age' is missing in type '{ name: string; }' but required in type 'User'.
Mỗi lỗi cho biết tên tệp, dòng và cột, một mã lỗi (TS2322) và điều gì sai. Trong JavaScript thuần, cả hai dòng đều chạy, và dòng thứ hai in ra Linus is undefined years old mà không có cảnh báo nào. Trong một editor như VS Code, các lỗi này hiện thành gạch chân đỏ ngay khi bạn gõ, cùng với gợi ý code biết chính xác rằng user có một name và một age.
Những bug điển hình mà bộ kiểm tra bắt được:
- Gõ sai tên thuộc tính hoặc phương thức (
user.nmae,list.lenght). - Gọi hàm với quá ít hoặc quá nhiều đối số, hoặc đối số sai kiểu.
- Dùng một giá trị có thể là
nullhoặcundefinedmà không kiểm tra trước. - Quên xử lý một trường hợp của union như
"loading" | "done" | "error", khi code có kiểm tra đầy đủ mọi trường hợp. - Code bị hỏng khi một hàm bạn phụ thuộc vào thay đổi chữ ký.
Kiểu biến mất lúc chạy
Kiểu của TypeScript chỉ tồn tại lúc biên dịch. Trình biên dịch kiểm tra chúng rồi loại bỏ: JavaScript được xuất ra không có chú thích kiểu, không có interface, và chạy giống hệt JavaScript bạn tự viết tay.
Đầu vào này:
function double(n: number): number {
return n * 2;
}
trở thành đầu ra này:
function double(n) {
return n * 2;
}
Vì vậy TypeScript không thể kiểm tra những giá trị đến khi chương trình đang chạy. Ở đây, đoạn văn bản JSON được khẳng định là một User, trình biên dịch buộc phải tin điều đó, và lúc chạy cũng không có gì báo lỗi:
Đầu ra:
string
thirty-six1
Dữ liệu từ bên ngoài chương trình (response API, dữ liệu nhập từ form, tệp) cần được kiểm tra lúc chạy, ví dụ bằng một hàm type guard xem xét giá trị. Khi đó TypeScript tin vào phép kiểm tra và tự thu hẹp kiểu cho bạn.
Ai tạo ra TypeScript và vì sao
TypeScript được tạo ra tại Microsoft, với Anders Hejlsberg (người thiết kế C#) dẫn dắt việc thiết kế. Nó được công bố rộng rãi vào tháng 10 năm 2012 với phiên bản 0.8, và bản 1.0 ra mắt vào tháng 4 năm 2014. TypeScript là mã nguồn mở theo giấy phép Apache 2.0 và được phát triển trên GitHub. Theo số người đóng góp hằng tháng mà GitHub thống kê, TypeScript trở thành ngôn ngữ được dùng nhiều nhất trên GitHub vào tháng 8 năm 2025, vượt qua Python và JavaScript.
Động lực ra đời là các codebase JavaScript lớn. JavaScript không có cách nào để nói "hàm này nhận một đối tượng user", nên đổi tên một thuộc tính hay sửa một hàm đồng nghĩa với việc tìm khắp codebase và hy vọng các bài test bao phủ mọi chỗ gọi. TypeScript bổ sung thông tin đó theo cách vẫn tương thích hoàn toàn với JavaScript:
- Nó là tập cha của JavaScript. JavaScript hợp lệ là cú pháp TypeScript hợp lệ, nên một dự án có thể chuyển đổi từng tệp một.
- Nó bám theo JavaScript. Ngoài vài bổ sung từ thời đầu như
enumvànamespace, TypeScript không thêm tính năng lúc chạy nào của riêng mình; cú pháp mới đến từ chuẩn JavaScript. - Kiểu không tốn gì lúc chạy. Chúng bị xóa đi, nên đầu ra nhanh ngang JavaScript viết tay.
Phiên bản chính hiện tại là TypeScript 7, với trình biên dịch được viết lại bằng Go thành chương trình native, kiểm tra kiểu các dự án lớn nhanh hơn khoảng mười lần so với trình biên dịch dựa trên JavaScript mà nó thay thế. Trang TypeScript 7 trình bày những gì đã thay đổi.
TypeScript dùng để làm gì? Frontend và backend
TypeScript được dùng cho cùng loại phần mềm như JavaScript, cả ở frontend lẫn backend. Vì đầu ra là JavaScript, JavaScript chạy ở đâu thì TypeScript dùng được ở đó:
| Ở đâu | TypeScript chạy ở đó như thế nào |
|---|---|
| Front end trên trình duyệt | Một công cụ build (Vite, webpack, esbuild) biên dịch nó sang JavaScript. React, Angular, Vue và Svelte đều hỗ trợ; dự án Angular mặc định dùng TypeScript. |
| Máy chủ và script Node.js | Biên dịch bằng tsc rồi chạy đầu ra .js, hoặc chạy trực tiếp tệp .ts: các phiên bản Node.js hiện tại tự loại bỏ kiểu. |
| Deno | Chạy trực tiếp tệp .ts; deno check kiểm tra kiểu cho chúng. |
| Bun | Chạy trực tiếp tệp .ts, không kiểm tra kiểu. |
| Desktop và di động | Electron, React Native và các công cụ tương tự đều chấp nhận TypeScript. |
Cùng một ngôn ngữ phủ cả hai phía của ứng dụng web, nên nhiều nhóm dùng chung định nghĩa kiểu (ví dụ hình dạng của một response API) giữa code máy chủ và code trình duyệt.
Code TypeScript trở thành JavaScript như thế nào
Có hai việc tách biệt, và mỗi việc do những công cụ khác nhau đảm nhận:
- Kiểm tra kiểu. Chỉ trình biên dịch TypeScript làm việc này, thường qua lệnh
tsc(deno checkcủa Deno chạy một bản sao của chính trình biên dịch đó). Nó đọc các tệp.ts, báo lỗi, và mặc định ghi ra luôn các tệp.js. - Xóa kiểu.
tsclàm được, và các công cụ nhanh hơn bỏ qua hoàn toàn bước kiểm tra kiểu cũng làm được: esbuild, SWC, Babel, và tính năng loại bỏ kiểu có sẵn trong Node.js, Deno và Bun.
Một cách thiết lập phổ biến là dùng công cụ nhanh để chạy code và tsc --noEmit (chỉ kiểm tra, không ghi gì) trong editor và trong CI. Cài tsc và chạy một tệp .ts đều có trang riêng trong chương này.
Các tính năng cốt lõi trong một ví dụ
TypeScript hằng ngày chỉ dùng một nhóm nhỏ tính năng. Khối code này gom các tính năng chính lại với nhau:
Đầu ra:
Ada ada@example.com
Ada can log in
Linus is banned
- Chú thích kiểu (
name: string) cho biết một biến, tham số, thuộc tính hoặc giá trị trả về chứa gì. - Suy luận kiểu điền vào những kiểu bạn bỏ trống:
accountlấy kiểu từ giá trị màfirsttrả về. - Interface và type alias (
interface Account,type Status) đặt tên cho hình dạng dữ liệu của bạn. - Union type (
"active" | "banned",T | undefined) mô tả một giá trị có thể là một trong nhiều thứ. - Thu hẹp kiểu: sau một phép kiểm tra như
account !== undefined, trình biên dịch biết trường hợp nào đang áp dụng bên trong khối lệnh. - Thuộc tính tùy chọn (
email?: string) có thể không có, nên kiểu của chúng bao gồmundefined. - Generic (
first<T>) cho phép một hàm hoặc một kiểu làm việc với nhiều kiểu mà vẫn giữ chúng liên kết với nhau: vào là mảngAccount, ra là mộtAccount.
Có cần học JavaScript trước không?
Học trước thì có ích, nhưng bạn có thể học cả hai cùng lúc. Mọi thứ về cách code TypeScript hoạt động lúc chạy (biến, hàm, đối tượng, mảng, promise, lớp) đều là JavaScript, và TypeScript thêm một lớp mô tả các giá trị đó. Nếu bạn đã biết JavaScript, phần mới là hệ thống kiểu: chú thích kiểu, interface, union, generic và thu hẹp kiểu. Nếu bạn mới với cả hai, hãy bắt đầu từ giá trị và hàm trong JavaScript cơ bản, rồi thêm kiểu dần dần; thông báo lỗi của trình biên dịch là một người thầy tốt, vì chúng chỉ đúng dòng mà một giá trị bị dùng sai.
Một thứ tự thực tế để học TypeScript: cài đặt và chạy tệp đầu tiên, học các kiểu cơ bản và kiểu đối tượng, sau đó đến union type và thu hẹp kiểu, rồi tiếp đến hàm và generic. Như vậy là đủ cho phần lớn code ứng dụng.
Câu hỏi thường gặp
Nói đơn giản, TypeScript là gì?
TypeScript là JavaScript có chú thích kiểu. Bạn viết let count: number = 0, và trình biên dịch kiểm tra để count chỉ luôn được dùng như một số. Sau đó trình biên dịch xóa các chú thích và xuất ra JavaScript bình thường, nên mọi nơi chạy được JavaScript đều chạy được kết quả này.
TypeScript là frontend hay backend?
Cả hai. TypeScript được biên dịch sang JavaScript, nên JavaScript chạy ở đâu thì TypeScript dùng được ở đó: front end trên trình duyệt (React, Angular, Vue, Svelte), máy chủ trên Node.js, Deno hoặc Bun, công cụ dòng lệnh, và ứng dụng desktop xây dựng bằng Electron. Việc kiểm tra kiểu hoạt động giống nhau ở mọi nơi.
TypeScript là ngôn ngữ lập trình hay framework?
Là một ngôn ngữ lập trình. Nó là tập cha (superset) của JavaScript: mọi chương trình JavaScript đều là cú pháp TypeScript hợp lệ, và TypeScript thêm một hệ thống kiểu lên trên. Nó không phải framework hay thư viện: các chú thích kiểu bị xóa lúc biên dịch và không thêm code nào vào chương trình của bạn.
Ai tạo ra TypeScript?
Microsoft. Anders Hejlsberg, người cũng thiết kế C#, dẫn dắt việc thiết kế. TypeScript được công bố rộng rãi vào tháng 10 năm 2012 với phiên bản 0.8, và là mã nguồn mở theo giấy phép Apache 2.0.
TypeScript có kiểm tra kiểu lúc chạy không?
Không. Mọi việc kiểm tra kiểu diễn ra lúc biên dịch, và các kiểu bị xóa khỏi đầu ra JavaScript. Nếu dữ liệu từ bên ngoài chương trình (response API, form, tệp JSON) có hình dạng sai, TypeScript không thể phát hiện khi chương trình đang chạy. Hãy kiểm tra dữ liệu đó bằng code chạy lúc runtime, ví dụ một type guard.