Phiên bản Beta của TypeScript 7.0 đã chính thức ra mắt vào ngày 21 tháng 4 và đây không phải là một bản phát hành TypeScript thông thường. Thay vì chỉ thêm một vài kiểu dữ liệu mới hay sửa lỗi nhỏ, toàn bộ trình biên dịch đã được viết lại từ ngôn ngữ TypeScript sang **Go**. Kết quả là một bước nhảy vọt về hiệu suất mà nhiều người khó có thể tin được.
Từ những tin đồn đầu tiên về việc chuyển đổi TypeScript sang Go, tôi đã theo dõi sát sao. Khi nghe tin đồn về việc “nhanh hơn gấp 10 lần”, tôi đã nghĩ đó chỉ là chiêu trò marketing. Nhưng rồi, tôi đã thử nghiệm nó trên một codebase thực tế.
Nó thực sự nhanh. Nhanh đến mức khó chịu, nhanh đến mức bạn phải tự hỏi liệu có điều gì đó bị lỗi. Đây là những gì thay đổi và ý nghĩa của nó đối với bạn.
Mục lục
Vì Sao Lại Chọn Go?
Đây là câu hỏi đầu tiên mà mọi người đặt ra: Tại sao không phải Rust? Tại sao không phải WASM?
Câu trả lời thành thật là: ưu tiên tốc độ chuyển đổi hơn là hiệu suất tối đa. Mô hình đồng bộ (concurrency) và cách bố trí bộ nhớ của Go rất phù hợp với cấu trúc trình biên dịch TypeScript hiện có. Việc viết lại bằng Rust sẽ mất nhiều năm và đòi hỏi một sự tái thiết kế hoàn toàn từ đầu. Trong khi đó, việc chuyển đổi sang Go chỉ mất khoảng một năm, và kiến trúc của nó hoàn toàn giống với logic kiểm tra kiểu của TypeScript 6.0 – cùng ngữ nghĩa, cùng kết quả.
Đây là một quyết định thực dụng và tôi tin rằng đó là lựa chọn đúng đắn.
Cách Trải Nghiệm Ngay Bây Giờ
Bạn có thể dễ dàng trải nghiệm TypeScript 7.0 Beta ngay lập tức.
Trước tiên, cài đặt gói xem trước:
npm install -D @typescript/native-preview@beta
Sau đó, thay vì chạy `tsc`, bạn hãy sử dụng `tsgo`:
npx tsgo --version
# Phiên bản 7.0.0-beta
Lưu ý: Hiện tại, gói có tên là `@typescript/native-preview`. Trong phiên bản ổn định, nó sẽ được tích hợp vào gói `typescript` thông thường với lệnh `tsc` quen thuộc.
Đối với người dùng VS Code, hãy tải tiện ích mở rộng **TypeScript Native Preview**. Đây không phải là một nguyên mẫu sơ khai; các đội ngũ tại Bloomberg, Figma, Slack, Google và nhiều công ty khác đã chạy các bản build tiền phát hành trong hơn một năm và nó đã hoạt động ổn định trong nhiều tháng.
Hiệu Suất Là Tâm Điểm Chính
Việc viết lại bằng Go không chỉ là một sự tò mò về trình biên dịch. Nó mở khóa khả năng song song hóa mà runtime JavaScript cũ không thể thực hiện được, mang lại những cải tiến đáng kinh ngạc:
* **`–checkers`**: Tham số này kiểm soát số lượng tiến trình kiểm tra kiểu chạy song song (mặc định là 4). Các codebase lớn hơn trên các máy chủ mạnh mẽ có thể tăng số này lên. Ngược lại, các CI runner có số lõi hạn chế nên giảm xuống.
* **`–builders`**: Tham số này kiểm soát việc build tham chiếu dự án song song, một tính năng quan trọng đối với các monorepo. Kết hợp với `–checkers`, hiệu suất sẽ được nhân lên. Ví dụ, `–checkers 4 –builders 4` có nghĩa là có thể chạy tới 16 tiến trình kiểm tra kiểu đồng thời.
* **`–singleThreaded`**: Nếu bạn cần gỡ lỗi hoặc so sánh hiệu suất với TypeScript 6 mà không có nhiễu từ việc song song hóa, bạn có thể sử dụng tùy chọn này.
Đội ngũ phát triển báo cáo về việc tăng tốc độ gấp ~10 lần trên các codebase lớn. Dựa trên những gì những người dùng đầu tiên chia sẻ công khai, con số này hoàn toàn chính xác.
Chạy 7.0 Song Song Với 6.0 (Không Gây Hỗn Loạn)
Phần này ban đầu có thể gây khó khăn, nhưng có một cách sạch sẽ để xử lý nó.
Có một gói tương thích mới: `@typescript/typescript6`. Gói này cung cấp một điểm truy cập `tsc6`, cho phép bạn chạy cả hai phiên bản mà không bị xung đột tên.
Nếu bạn sử dụng các công cụ như `typescript-eslint` có phụ thuộc trực tiếp vào gói `typescript`, bạn có thể thực hiện cấu hình sau trong `package.json` của mình:
{
"devDependencies": {
"typescript": "npm:@typescript/typescript6@^6.0.0"
}
}
Việc này sẽ tạo một alias cho gói `typescript` thành phiên bản 6.0, giúp các công cụ hiện có của bạn hoạt động bình thường trong khi bạn vẫn có thể thử nghiệm với `tsgo` ở một bên.
Những Thay Đổi Gây Đổ Vỡ – Những Điều Có Thể Ảnh Hưởng Đến Bạn
TypeScript 7.0 áp dụng các cài đặt mặc định của 6.0 như các yêu cầu bắt buộc. Nhiều cài đặt trước đây là tùy chọn, nhưng giờ đây chúng sẽ luôn bật và không có cách nào để tắt chúng.
Các cài đặt mặc định đã thay đổi:
- `strict` mặc định là `true`
- `module` mặc định là `esnext`
- `noUncheckedSideEffectImports` mặc định là `true`
- `types` mặc định là `[]` – các gói `@types/node` của bạn sẽ không được tự động nhận diện nữa
Thay đổi `rootDir` có vẻ nhỏ nhưng sẽ khiến bạn phải chú ý:
Nếu `tsconfig.json` của bạn nằm bên ngoài thư mục `src/` (khá phổ biến), bạn cần thêm cấu hình sau:
{
"compilerOptions": {
"rootDir": "./src"
},
"include": ["./src"]
}
Thay đổi `types` cũng sẽ khiến bạn phải điều chỉnh:
{
"compilerOptions": {
"types": ["node", "jest"]
}
}
Bạn cần liệt kê rõ ràng mọi gói `@types` mà dự án của bạn yêu cầu. Sẽ không còn các biến global ẩn từ mọi thứ trong `node_modules/@types` nữa.
Những thứ đã bị loại bỏ hoàn toàn:
- `target: es5` – không còn được hỗ trợ
- `moduleResolution: node` / `node10` – hãy sử dụng `nodenext` hoặc `bundler`
- `module: amd`, `umd`, `systemjs`, `none` – đã biến mất
- `baseUrl` – hãy sử dụng `paths` tương đối so với thư mục gốc của dự án thay thế
- `downlevelIteration` – đã bị loại bỏ
Nếu bạn vẫn đang sử dụng bất kỳ tùy chọn nào trong số này, việc di chuyển sang TypeScript 6.0 trước sẽ giúp quá trình chuyển đổi lên 7.0 suôn sẻ hơn.
Hỗ Trợ JavaScript Được Suy Nghĩ Lại Hoàn Toàn
Điểm này có thể đã bị bỏ qua cho đến khi đọc chi tiết. TypeScript 7.0 đã viết lại cách xử lý các tệp `.js` – chuyển từ hỗ trợ JSDoc theo phong cách Closure sang các mẫu nhất quán với các tệp `.ts`.
Những thay đổi chính bao gồm:
- `@enum` không còn là đặc biệt nữa – bạn cần sử dụng `@typedef` thay thế
- `@class` trên một hàm không còn biến nó thành một constructor nữa – hãy sử dụng khai báo lớp
- Cú pháp hàm theo phong cách Closure như `function(string): void` đã bị loại bỏ – hãy sử dụng `(s: string) => void`
- `values` không thể được sử dụng ở nơi mong đợi các kiểu – hãy sử dụng `typeof someValue`
Nếu bạn có một codebase thuần JavaScript dựa vào suy luận JSDoc của TypeScript, hãy kiểm tra tệp CHANGES.md trước khi nâng cấp.
Những Gì Vẫn Còn Thiếu Sót
Nhãn “beta” là có thật, nhưng nó không che giấu một thảm họa nào – nó chỉ báo hiệu một vài lỗ hổng đã biết:
- Chưa có API lập trình ổn định (sớm nhất là TypeScript 7.1)
- Chế độ `–watch` kém hiệu quả hơn so với phiên bản cuối cùng
- Một số tính năng của VS Code vẫn đang được phát triển: tô sáng nâng cao ngữ nghĩa, các lệnh import chi tiết hơn
- Việc phát ra tệp khai báo từ các tệp `.js` vẫn đang được hoàn thiện
Nếu bạn phụ thuộc vào API trình biên dịch TypeScript cho các công cụ tùy chỉnh của mình, hãy đợi phiên bản 7.1. Đối với mọi thứ khác – kiểm tra kiểu trong CI, trải nghiệm trình soạn thảo, thời gian build – TypeScript 7.0 Beta đã sẵn sàng để sử dụng.
Đánh Giá Của Tôi
Việc chuyển đổi sang Go là một quyết định kỹ thuật thực sự ấn tượng. Dù Go không phải là lựa chọn ngôn ngữ quyến rũ nhất hay đạt đỉnh cao lý thuyết, nhưng nó đã được triển khai chỉ trong khoảng một năm và đã hoạt động hiệu quả trên các codebase hàng triệu dòng mã.
Những thay đổi gây đổ vỡ là có thật, nhưng hầu hết chúng đều đã được dự kiến. TypeScript 6.0 đã cho mọi người một năm để chuẩn bị. Nếu bạn đã theo dõi các bản phát hành, 7.0 sẽ giống như một sự di chuyển nhỏ với phần thưởng hiệu suất khổng lồ.
Nếu bạn chưa từng động đến tệp `tsconfig.json` trong hai năm và vẫn còn `moduleResolution: node` trong đó… thì bạn có một số việc cần phải dọn dẹp. Nhưng việc dọn dẹp đó đã quá hạn bất kể TypeScript 7 có tồn tại hay không.
Hãy thử ngay hôm nay để tự mình trải nghiệm:
npm install -D @typescript/native-preview@beta
npx tsgo --version
Hãy chạy nó trên một dự án thực tế và để tốc độ của nó là lý do để bạn cuối cùng cũng nâng cấp cấu hình cũ của mình.
Lưu ý: Nếu bạn phát hiện bất kỳ vấn đề nào, đội ngũ phát triển mong muốn nhận được phản hồi tại trình theo dõi vấn đề microsoft/typescript-go – không phải repo TypeScript chính. Sự phân biệt này rất quan trọng trong giai đoạn beta.



