! nói với TypeScript rằng giá trị chắc chắn không phải null/undefined — và cũng không kiểm tra gì lúc chạy.
typescript
const el = document.getElementById('app')! // kiểu: HTMLElement (bỏ null)
el.classList.add('ready') // nếu không có #app → TypeError lúc chạyCác cách thay thế, xếp theo mức an toàn giảm dần:
typescript
// 1. optional chaining — an toàn nhất, không làm gì nếu null
el?.classList.add('ready')
// 2. kiểm tra tường minh — rõ ràng nhất, xử lý được trường hợp thiếu
if (!el) throw new Error('#app không tồn tại')
el.classList.add('ready')
// 3. non-null assertion — chỉ khi thật sự chắc chắn
el!.classList.add('ready')Còn một dạng khác của ! — definite assignment assertion trên khai báo thuộc tính:
typescript
class Service {
private client!: Client // TS đừng lo, tôi gán trong init()
init() { this.client = new Client() }
}Dạng này hay dùng với dependency injection, nhưng cũng chính là chỗ tắt mất strictPropertyInitialization.
Chốt: ! chỉ nên xuất hiện khi ngữ cảnh thật sự đảm bảo — ví dụ ngay sau một lần kiểm tra mà TypeScript không theo dõi được. Rải ! để làm im lỗi biên dịch là cách chuyển lỗi từ lúc build sang lúc người dùng gặp.