Hậu tố ! cho compiler biết "Tôi đảm bảo giá trị này không phải null hay undefined ở đây" — loại bỏ null/undefined khỏi kiểu của nó mà không có bất kỳ kiểm tra runtime nào.
ts
() {
.(name!.());
}
Hậu tố ! cho compiler biết "Tôi đảm bảo giá trị này không phải null hay undefined ở đây" — loại bỏ null/undefined khỏi kiểu của nó mà không có bất kỳ kiểm tra runtime nào.
() {
.(name!.());
}
Nó hoàn toàn là một assertion lúc compile-time — giống như as, nó không xác thực gì ở runtime. Nếu bạn sai, nó sẽ crash:
const el = document.getElementById("app")!; // khẳng định non-null
el.innerHTML = "hi"; // 💥 lỗi runtime nếu #app thực sự không tồn tại
// 1. Bạn đã đảm bảo về mặt logic, nhưng compiler không thấy được
if (map.has(key)) map.get(key)!.doThing(); // has() chứng minh get() không phải undefined
// 2. Field của class được khởi tạo bên ngoài constructor (DI, lifecycle hook)
class C { value!: string; } // definite assignment assertion
name?.toUpperCase(); // optional chaining — không crash, trả về undefined
const x = name ?? "default"; // cung cấp giá trị mặc định
if (name) name.toUpperCase(); // narrow bằng một kiểm tra thực sự
Mỗi cách này xử lý trường hợp thiếu thay vì khẳng định bỏ qua nó.
! là một công cụ sắc bén: nó làm im lặng tính null-safety mà compiler đang cố trao cho bạn.
Đôi khi nó hợp lý (bạn có kiến thức mà compiler thiếu), nhưng lạm dụng nó sẽ tái xuất hiện chính những bug null-crash mà strictNullChecks ngăn chặn.
Hãy dùng ?., ??, hoặc một guard tường minh trước; chỉ dùng ! khi bạn thực sự có thể chứng minh tính non-null.