TypeScript 7 với trình biên dịch mới dựa trên Go, tsgo, đang gây lỗi cho các công cụ phát triển phổ biến như ESLint, ts-jest và ts-morph. Tình trạng này sẽ tiếp diễn cho đến khi API lập trình của trình biên dịch ổn định trong bản phát hành 7.1 sắp tới, điều này có nghĩa là các đội ngũ đang phụ thuộc vào các công cụ này nên tạm dừng mọi kế hoạch nâng cấp.
Những thay đổi trong TypeScript 7
Bản phát hành này giới thiệu tsgo, một bản chuyển đổi sang Go của bộ kiểm tra kiểu (type-checker) mà đội ngũ TypeScript đã đặt mật danh là Project Corsa. Bằng cách chuyển lõi từ JavaScript sang Go, trình biên dịch có thể cung cấp tốc độ build nhanh hơn gấp mười lần, một tiêu đề đã thu hút những người dùng sớm đang muốn rút ngắn thời gian chạy các pipeline CI.
Tại sao các công cụ lại gặp lỗi
Các công cụ làm việc với TypeScript không giao tiếp trực tiếp với bộ kiểm tra kiểu. Chúng gọi một tập hợp các API nội bộ để hiển thị thông tin kiểu, chẩn đoán (diagnostics) và duyệt AST. Những API đó đã được viết lại cho tsgo và vẫn đang trong quá trình thay đổi cho đến phiên bản 7.1. Kết quả là một chuỗi các lỗi crash và lỗi im lặng (silent failures):
- typescript-eslint – npm từ chối cài đặt nó cùng với TypeScript 7; việc ép buộc cài đặt sẽ khiến ESLint ném ra lỗi
TypeError. - ts-jest – cố gắng gọi các phương thức nội bộ không còn tồn tại trong phiên bản Go, khiến quá trình chuyển đổi tệp kiểm thử (test-file transformation) bị hủy bỏ.
- ts-morph – mong đợi API ổn định để duyệt cấu trúc mã; với API hiện tại, nó có thể trả về kết quả sai hoặc thất bại mà không có cảnh báo.
- Monorepos – tsgo loại bỏ một số tham số kiểu generic nhất định, dẫn đến các lỗi kiểu chỉ xuất hiện trong các dự án lớn, đa gói (multi-package).
Bất kỳ quy trình làm việc nào kết hợp linting, kiểm thử Jest hoặc phân tích mã với TypeScript 7 đều có khả năng gặp lỗi build (build báo đỏ).
Những ai bị ảnh hưởng
- Các đội ngũ front-end chạy ESLint như một phần của mọi pull request.
- Các dịch vụ back-end dựa vào ts-jest để kiểm thử đơn vị (unit testing).
- Các thư viện sử dụng ts-morph để tạo mã (code generation) hoặc tài liệu.
- Các tổ chức có thiết lập monorepo nơi việc suy luận kiểu (type inference) vốn đã phức tạp.
Nếu pipeline CI của bạn báo lỗi đỏ sau khi nâng cấp TypeScript, nguyên nhân có thể là một trong những điều trên.
Lộ trình di chuyển an toàn cho đến bản 7.1
Cách đơn giản nhất để duy trì lợi ích về tốc độ mà không làm hỏng các công cụ là tách biệt bước kiểm tra kiểu nhanh khỏi quá trình build thực tế:
- Cố định phiên bản TypeScript chính ở 6.x – điều này giúp duy trì API ổn định mà tất cả các công cụ đều mong đợi.
- Thêm
@typescript/native-previewlàm dev dependency – gói này cung cấp file thực thi tsgo để kiểm tra kiểu nhanh trong CI. - Chạy tsgo với
--noEmitđể kiểm tra nhanh – nó xác thực các kiểu nhưng không tạo ra các tệp đầu ra. - Sử dụng trình biên dịch
tsctruyền thống cho các bản build thực tế –tscvẫn tạo ra JavaScript và tuân thủ API 6.x.
npm install -D typescript@^6.9
npm install -D @typescript/native-preview
Cập nhật các script trong package.json của bạn:
{
"scripts": {
"typecheck:fast": "tsgo --noEmit",
"build": "tsc"
}
}
Với thiết lập kép này, bạn vẫn giữ được tốc độ tăng gấp mười lần trong CI trong khi vẫn duy trì khả năng tương thích với ESLint, ts-jest và ts-morph.
Khi nào bạn có thể nâng cấp thẳng lên 7.0
Nếu mã nguồn của bạn chỉ gọi tsc — không linting, không Jest, không ts-morph — thì API không ổn định sẽ không ảnh hưởng đến bạn. Trong kịch bản hẹp đó, bạn có thể chuyển sang TypeScript 7 ngay lập tức và tận hưởng sự cải thiện hiệu suất mà không cần thêm các bước bổ sung.
Những điều cần lưu ý
- Phiên bản 7.1 – đội ngũ TypeScript đã ra tín hiệu rằng API lập trình sẽ được chốt (frozen) trong bản phát hành này. Khi nó ra mắt, cầu nối giữa tsgo và các công cụ hiện có sẽ biến mất, cho phép nâng cấp một cách sạch sẽ.
- Cập nhật công cụ – hãy theo dõi các bản phát hành mới của
typescript-eslint,ts-jestvàts-morph. Họ sẽ sớm phát hành các phiên bản tương thích ngay sau khi bản 7.1 ra mắt. - Cấu hình CI – hãy nhớ thay thế
tsgo --noEmitbằng lệnhtscthông thường khi API ổn định; gói preview sẽ không còn cần thiết nữa.
Lời khuyên: Cho đến khi API 7.1 được chốt, hãy giữ TypeScript 6.x làm trình biên dịch chính, thêm @typescript/native-preview để kiểm tra nhanh và tiếp tục sử dụng tsc để build. Điều này giúp tránh lỗi linting và kiểm thử trong khi vẫn tận dụng được lợi ích hiệu suất của engine Go mới.
