Anh em ạ, TypeScript 5.0 không chỉ là một bản cập nhật thông thường đâu. Mình đã trải nghiệm và thấy nó thực sự thay đổi cuộc chơi, đặc biệt là với sự trở lại của Decorators theo chuẩn ECMAScript và những cải tiến vượt bậc về hiệu suất. Quên đi nỗi lo build time ì ạch hay phải dùng cờ --experimentalDecorators đi. Phiên bản này giúp mã sạch hơn, an toàn hơn và quá trình build dự án nhanh hơn đáng kể. Nếu bạn đang tự hỏi TypeScript 5 tính năng mới nhất có gì đáng chú ý, thì đây chính là câu trả lời.
Decorators chính thức tái xuất – “Phép thuật” cho Class và Method đã quay trở lại!
Decorators trong TypeScript 5 đã chính thức tuân theo tiêu chuẩn ECMAScript (Stage 3), cho phép bạn tùy chỉnh class và method gọn gàng mà không cần cấu hình phức tạp.
Cú pháp mới gọn gàng, chuẩn ECMAScript: Tạm biệt flag “experimentalDecorators”
Bạn không còn phải bật cờ thử nghiệm trong file cấu hình nữa, vì TypeScript 5 đã hỗ trợ native cho Decorators.
Nhiều anh em làm phát triển phần mềm lâu năm chắc hẳn đã quen với Decorators. Trước đây, mỗi lần setup dự án, mình đều phải đau đầu với cái flag experimentalDecorators trong tsconfig.json. Nhưng với TypeScript 5.0 có những thay đổi gì? Tin vui là Decorators giờ đã là một phần của chuẩn ESM (ECMAScript Modules) Stage 3.
Điều này có nghĩa là cú pháp đã ổn định, chuẩn hóa và được hỗ trợ “out of the box” bởi tsc (TypeScript Compiler). Việc loại bỏ cờ thử nghiệm không chỉ giúp file cấu hình sạch sẽ hơn mà còn khẳng định sự trưởng thành của tính năng này. Đối với các kỹ sư frontend và kỹ sư backend, đây là một bước tiến lớn trong OOP (Lập trình hướng đối tượng).
Đây là một phần quan trọng của ngôn ngữ. Với người mới, việc tìm hiểu Học TypeScript từ đầu cho JavaScript developer là bước đệm tuyệt vời để nắm bắt các concept nâng cao này.
Ứng dụng thực tế: Từ validation, logging cho API trong NestJS đến việc “trang trí” cho component trong Angular
Cách sử dụng Decorators trong TypeScript 5 cực kỳ hữu ích để xử lý các logic cắt ngang (cross-cutting concerns) như logging, validation.
Tại Phạm Hải, mình thường xuyên làm việc với các framework nặng về Decorators như NestJS và Angular. Cách tiếp cận mới giúp việc tái sử dụng logic trở nên thanh lịch hơn bao giờ hết. Trong NestJS, bạn có thể dễ dàng quản lý routing với @Get() hoặc dependency injection bằng @Injectable().
Giờ đây, bạn có thể tự tin viết một @LoggedMethod để tự động in ra log mỗi khi một hàm API được gọi, hoặc dùng @Validate để kiểm tra dữ liệu đầu vào. Những lợi ích của TypeScript 5 cho nhà phát triển thể hiện rõ nhất khi bạn phải quản lý một codebase phức tạp. Nó giúp tách biệt phần logic nghiệp vụ cốt lõi khỏi các tác vụ phụ trợ, giữ cho code luôn “sạch”.
Để tăng cường an toàn dữ liệu, bạn có thể kết hợp Decorators với các thư viện bên ngoài. Tìm hiểu thêm về Zod validation schema TypeScript để thấy sự kết hợp hoàn hảo này.
Ví dụ code “trước và sau”: Mình chỉ cho bạn thấy decorator mới giúp giảm boilerplate code như thế nào
Decorators mới thay thế các wrapper function cồng kềnh, giúp class của bạn giữ được sự tập trung và dễ đọc hơn rất nhiều.
Để mình lấy một ví dụ thực tế. Giả sử bạn muốn log thời gian thực thi của một method. Trước đây, bạn phải bọc logic bên trong một hàm khác, tạo ra rất nhiều boilerplate code. Giờ đây, bạn chỉ cần gắn @logged ngay trên method.
class APIClient {
@logged
async fetchData() {
// Logic fetch data từ server
}
}
Cú pháp này không chỉ đẹp mà còn tận dụng tối đa khả năng Static Typing. Khi kết hợp với các tính năng như Khởi tạo thuộc tính lớp và Chữ ký hàm tạo trừu tượng, code của bạn sẽ cực kỳ chặt chẽ.
TypeScript 5 nâng cao chất lượng mã như thế nào? Chính là nhờ việc giảm thiểu những đoạn code lặp đi lặp lại dễ sinh lỗi này. Sự thay đổi này thực sự mang lại luồng gió mới cho các dự án JavaScript quy mô lớn.
Tốc độ và hiệu suất vượt trội: Build dự án không còn là “nỗi ám ảnh” chờ đợi

Phiên bản này mang đến những tối ưu hóa sâu bên trong trình biên dịch, giúp giảm dung lượng package và tăng tốc độ build lên đến 20%.
Module Resolution “Bundler”: Tối ưu riêng cho các công cụ build hiện đại như Vite, esbuild, Webpack
Tùy chọn moduleResolution: "bundler" được thiết kế đặc biệt để TypeScript hiểu đúng cách các công cụ đóng gói hiện đại xử lý import.
Một trong các tính năng nổi bật của TypeScript 5 là sự ra đời của Module Resolution Bundler. Trước đây, chúng ta thường dùng node hoặc node16, nhưng chúng lại bắt buộc phải ghi rõ đuôi file (như .js) trong các câu lệnh import. Điều này thường gây khó chịu vì các bundler hiện đại không hề yêu cầu.
Với tùy chọn "bundler" mới, TypeScript giờ đây đã “nói cùng ngôn ngữ” với Vite, esbuild, Webpack, Parcel, và swc. TypeScript 5 hỗ trợ bundler như thế nào? Nó cho phép bạn import file gọn gàng không cần đuôi mở rộng, đồng thời hỗ trợ tốt cơ chế exports trong package.json.
Điều này đặc biệt ý nghĩa khi xây dựng các ứng dụng giao diện người dùng phức tạp. Nếu bạn đang làm việc với stack phổ biến này, xem ngay TypeScript với React hướng dẫn tích hợp để cấu hình chuẩn nhất.
Những con số biết nói: Giảm thời gian khởi động, biên dịch và cả dung lượng package
Việc loại bỏ namespace và chuyển sang module giúp TypeScript 5 giảm ~59% dung lượng cài đặt và tăng tốc độ build đáng kể.
Anh em có biết tại sao cải thiện hiệu suất biên dịch với TypeScript 5 lại được khen ngợi hết lời không? Microsoft đã tái cấu trúc lại toàn bộ mã nguồn của TypeScript, chuyển từ namespaces sang ESM. Kết quả là dung lượng package giảm từ 63.8MB xuống chỉ còn khoảng 26.4MB.
Dưới đây là bảng so sánh hiệu suất dựa trên các báo cáo thực tế tính đến nay:
| Tiêu chí đánh giá | Cải thiện so với bản 4.9 | Ý nghĩa thực tế |
|---|---|---|
| Dung lượng Npm Package | Giảm ~59% | Cài đặt npm install nhanh hơn, Docker image nhẹ hơn |
| Tốc độ build Material-UI | Nhanh hơn 10% | Tiết kiệm đáng kể thời gian chạy CI/CD |
| Khởi động Visual Studio Code (VS Code) | Nhanh hơn 20% | Trải nghiệm gõ code mượt mà, ít giật lag hơn |
Với một Full-stack developer hay phải chạy lại server liên tục trên Node.js, việc tiết kiệm vài giây mỗi lần lưu file thực sự là một món quà vô giá. Việc dọn dẹp các đoạn code cũ kỹ cũng đóng góp lớn vào thành quả này. TypeScript 5 và tối ưu hóa dự án lớn giờ đây đi liền với nhau nhờ những con số ấn tượng này.
Cải thiện hiệu suất với –verbatimModuleSyntax: Đảm bảo import/export được xử lý nhất quán, tránh lỗi không đáng có
Cờ --verbatimModuleSyntax giúp đơn giản hóa việc quản lý các câu lệnh import/export, đảm bảo trình biên dịch loại bỏ chính xác các type-only imports.
Khi làm việc với các dự án lớn, việc vô tình import thừa các type vào runtime có thể gây phình bundle size. Phiên bản mới giới thiệu cờ --verbatimModuleSyntax. Khi bật tính năng này, bất kỳ câu lệnh import nào không có từ khóa type sẽ được giữ nguyên.
Ngược lại, nếu có từ khóa type, nó sẽ bị loại bỏ hoàn toàn khỏi mã JavaScript biên dịch. Điều này mang lại sự rõ ràng tuyệt đối và giúp các công cụ build hoạt động hiệu quả hơn. Nó là một phần của chiến lược TypeScript 5 cho frontend và backend, giúp quá trình chuyển đổi mã an toàn hơn.
Nếu bạn đang có ý định nâng cấp dự án cũ, hãy tham khảo Migration JavaScript sang TypeScript từng bước để áp dụng cờ này một cách hiệu quả nhất.
Những cải tiến “nhỏ mà có võ” giúp code an toàn và linh hoạt hơn
Bên cạnh tốc độ, phiên bản này mang đến Const Type Parameters, Union Enums và export type * để siết chặt an toàn kiểu.
Const Type Parameters: Siết chặt kiểu dữ liệu, giúp TypeScript suy luận kiểu chính xác hơn, đặc biệt với các giá trị bất biến
Thêm modifier const vào generic type parameter giúp trình biên dịch tự động suy luận ra kiểu literal chính xác nhất thay vì kiểu chung chung.
Const Type Parameters là một trong những kiểu dữ liệu mới trong TypeScript 5 (hay chính xác hơn là cách xử lý kiểu) mà mình cực kỳ ưng ý. Trước đây, khi truyền một mảng vào hàm generic, hệ thống thường suy luận nó thành mảng mutable (ví dụ string[]).
Để ép nó thành tuple bất biến, bạn phải thêm as const lúc gọi hàm. Giờ đây, bạn chỉ cần khai báo <const T> ở định nghĩa hàm. Hãy xem sự khác biệt:
// Cách cũ (Trước TS 5.0)
function getNames<T>(names: T[]) {
return names;
}
const oldResult = getNames(["Hai", "Pham"] as const);
// Cách mới với TS 5.0
function getNamesNew<const T>(names: T) {
return names;
}
// 'newResult' tự động được suy luận là readonly ["Hai", "Pham"]
const newResult = getNamesNew(["Hai", "Pham"]);
Tính năng này cải thiện suy luận kiểu một cách xuất sắc, kết hợp hoàn hảo với Variadic Tuple Types và Key Remapping để tạo ra các utility types mạnh mẽ. Khái niệm này có thể hơi trừu tượng với người mới. Để nắm vững nền tảng, bạn nên xem qua TypeScript Generics giải thích dễ hiểu có ví dụ.
All Enums are Union Enums: Giờ đây tất cả enums đều được coi là union, giúp việc narrowing và kiểm tra kiểu với enums trở nên an toàn và dễ đoán hơn
Mọi enum giờ đây đều hoạt động như một union type, cho phép narrowing chính xác và ngăn chặn việc gán các giá trị không hợp lệ.
Union Enums đã giải quyết triệt để một “nỗi đau” tồn tại từ lâu. Trước đây, nếu bạn có một enum chứa các giá trị được tính toán (computed members), trình biên dịch sẽ coi nó như một kiểu số chung chung. Điều này dẫn đến rủi ro gán sai giá trị mà không bị báo lỗi.
Với bản cập nhật này, mỗi thành viên trong enum đều có một type riêng biệt. Ví dụ, bạn có thể định nghĩa một type mới chỉ bao gồm một vài giá trị cụ thể từ enum gốc:
enum LogLevel {
Debug,
Info,
Warning = Math.random() > 0.5 ? 2 : 3, // Giá trị tính toán
Error
}
// TS 5.0 hiểu chính xác từng giá trị, không còn là number chung chung
type InfoOrError = LogLevel.Info | LogLevel.Error;
Điều này tăng cường an toàn kiểu và hỗ trợ Null Checking tốt hơn khi dùng trong các câu lệnh switch-case. Các tính năng mới nhất của TypeScript ảnh hưởng đến dự án theo cách bắt buộc bạn phải viết code chuẩn chỉnh hơn.
Đây là một phần của việc tuân thủ các tiêu chuẩn khắt khe trong lập trình. Xem thêm về TypeScript strict mode best practices để tối ưu hóa codebase của bạn.
Hỗ trợ “export type *”: Tái cấu trúc và quản lý các module type một cách gọn gàng, sạch sẽ hơn trong các dự án lớn
Cú pháp export type * from "module" giúp bạn re-export toàn bộ các type từ một file khác mà không sợ lẫn lộn với các giá trị runtime.
Trong các dự án enterprise, việc tổ chức file export (barrel files) rất phổ biến. Bản cập nhật bổ sung cú pháp **export type ***, cho phép bạn re-export tất cả các Type Aliases và Interfaces từ một module khác một cách rõ ràng.
Cùng với sự hỗ trợ của các JSDoc tags mới như @satisfies và @overload, hay những tính năng quản lý tài nguyên như using declarations và Deferred Type Parameter Instantiation ở các phiên bản tiếp theo, chất lượng mã của bạn sẽ được nâng lên một tầm cao mới.
Khi xuất file, việc hiểu rõ bản chất các loại kiểu là rất cần thiết. Đừng bỏ lỡ bài viết Interface vs Type TypeScript khác nhau thế nào để có cái nhìn sâu sắc hơn.
Tóm lại, việc cập nhật để tận dụng TypeScript 5 tính năng mới nhất không chỉ là để “bắt trend”. Đây là một bước tiến thực sự về trải nghiệm cho lập trình viên và hiệu suất dự án. Từ Decorators mạnh mẽ, tốc độ biên dịch được cải thiện cho đến các tính năng giúp code an toàn hơn, tất cả đều là những lý do xác đáng để bạn cân nhắc áp dụng ngay vào codebase của mình. Tại Phạm Hải, chúng mình luôn khuyến khích anh em nâng cấp để tận hưởng một môi trường phát triển mượt mà và ít bug hơn.
Bạn đã thử tính năng nào của TypeScript 5 chưa hay vẫn còn e ngại điều gì trong quá trình migration? Để lại bình luận chia sẻ kinh nghiệm hoặc câu hỏi nhé, mình sẽ vào thảo luận cùng anh em!
Lưu ý: Thông tin trong bài viết này chỉ mang tính chất tham khảo. Để có được lời khuyên tốt nhất, vui lòng liên hệ trực tiếp với chúng tôi để được tư vấn cụ thể dựa trên nhu cầu thực tế của bạn.