as ghi đè suy luận kiểu của TypeScript lúc biên dịch, và không kiểm tra gì lúc chạy.
typescript
const canvas = document.getElementById('c') as HTMLCanvasElement
canvas.getContext('2d') // TS cho phép; nếu #c không tồn tại → lỗi lúc chạyHai trường hợp dùng hợp lý:
1. DOM — TypeScript chỉ biết HTMLElement, bạn biết cụ thể hơn.
2. as const — giữ literal type, đây là dạng assertion an toàn nhất.
Hai trường hợp không nên:
typescript
const user = JSON.parse(raw) as User // lời hứa suông, không ai kiểm tra
const x = something as unknown as Foo // double assertion — dấu hiệu mô hình kiểu đang saiDữ liệu từ bên ngoài phải kiểm tra khi chạy, không assert:
typescript
import { z } from 'zod'
const UserSchema = z.object({ id: z.number(), name: z.string() })
const user = UserSchema.parse(JSON.parse(raw)) // sai kiểu là ném lỗi ngayThay thế an toàn hơn as trong nhiều tình huống là type guard:
typescript
function isUser(v: unknown): v is User {
return typeof v === 'object' && v !== null && 'id' in v
}
if (isUser(data)) data.id // TS thu hẹp kiểu, và có kiểm tra thậtChốt: as nói "tôi biết rõ hơn trình biên dịch".
- Đúng với DOM; sai với dữ liệu mạng.
- Số lượng
astrong một codebase thường tỉ lệ thuận với số bugundefinedlúc chạy.