any, unknown, never - Specific Types trong TypeScript | TypeScript Series
Hiểu dễ dàng về “Specific Types” trong TypeScript
Khi mới học TypeScript, ta thường biết đến các kiểu cơ bản như:
string, number, boolean, array, object…
Nhưng ngoài những kiểu này, TypeScript còn có một nhóm kiểu đặc biệt (special types) giúp bạn xử lý các trường hợp “lạ” – ví dụ:
- Dữ liệu chưa biết là kiểu gì
- Hàm không bao giờ trả về
- Biến có thể là
nullhoặcundefined
Nếu hiểu rõ và dùng đúng, bạn sẽ viết code an toàn, ít lỗi, và dễ đọc hơn rất nhiều.
1. any – Kiểu “tự do vô đối”
any nghĩa là “bất cứ kiểu gì cũng được”.
TypeScript sẽ không kiểm tra lỗi kiểu cho biến đó.
Ví dụ:
let x: any = 5;
x = "Hello"; // OK
x = { a: 1 }; // OK
x.toUpperCase(); // OK (nhưng có thể lỗi khi chạy)
Khi nào dùng:
- Khi bạn đang chuyển từ JavaScript sang TypeScript và chưa biết rõ kiểu dữ liệu.
- Khi bạn cần xử lý dữ liệu rất linh hoạt (ví dụ dữ liệu đến từ API mà bạn chưa định nghĩa rõ).
Lời khuyên:
👉 Dùng any tạm thời thôi.
Về lâu dài, hãy cố gắng thay bằng unknown hoặc kiểu rõ ràng hơn.
2. unknown – Giống any nhưng an toàn hơn
unknown cũng có thể chứa bất kỳ giá trị nào — nhưng bạn phải kiểm tra kiểu trước khi sử dụng.
Điều này giúp tránh lỗi khi chạy chương trình.
Ví dụ:
let data: unknown = "Xin chào";
if (typeof data === "string") {
console.log(data.toUpperCase()); // OK vì đã kiểm tra kiểu
}
data = 123;
// console.log(data.toUpperCase()); ❌ Lỗi — chưa kiểm tra kiểu
Khi nào dùng:
- Khi nhận dữ liệu từ bên ngoài (API, form nhập liệu, JSON, v.v.) mà chưa biết chắc kiểu là gì.
Lời khuyên:
👉 Nếu không cần quá linh hoạt, hãy dùng unknown thay cho any.
Nó giúp TypeScript bảo vệ bạn khỏi lỗi kiểu sai.
3. never – Kiểu “không bao giờ xảy ra”
never dùng cho:
- Hàm không bao giờ trả về (ví dụ: luôn ném lỗi, hoặc chạy vô tận).
- Trường hợp mà giá trị “không thể tồn tại”.
Ví dụ 1 – Hàm ném lỗi:
function throwError(message: string): never {
throw new Error(message);
}
Ví dụ 2 – Kiểm tra hết các trường hợp:
type Shape = "circle" | "square";
function getArea(shape: Shape) {
switch (shape) {
case "circle":
return 10;
case "square":
return 20;
default:
const neverCase: never = shape; // Nếu có case mới, thiếu case trong switch → báo lỗi
}
}
Lời khuyên:
👉 never hữu ích khi bạn muốn đảm bảo đã xử lý hết tất cả tình huống trong một switch hoặc union type.
4. null và undefined – Kiểu “không có gì”
undefined: biến đã khai báo nhưng chưa được gán giá trị.null: biến được gán rõ ràng là “không có giá trị”.
Ví dụ:
let a: undefined = undefined;
let b: null = null;
let name: string | null = null;
name = "Albert";
Tùy chọn trong TypeScript:
Nếu bạn bật strictNullChecks: true (trong tsconfig.json),
TypeScript sẽ yêu cầu bạn xử lý rõ ràng các trường hợp null và undefined.
Ví dụ thực tế:
function greet(name?: string) {
console.log(`Hello, ${name ?? "stranger"}`);
}
(?? là toán tử “nullish coalescing” – nếu name là null hoặc undefined, dùng "stranger" thay thế.)
Lời khuyên:
👉 Luôn bật strictNullChecks để tránh lỗi kiểu khi biến không có giá trị.
Tóm tắt nhanh
| Kiểu | Ý nghĩa | Khi nên dùng |
|---|---|---|
any |
Bỏ qua kiểm tra kiểu | Khi tạm thời chưa biết kiểu dữ liệu |
unknown |
Giống any nhưng an toàn hơn |
Khi dữ liệu đến từ bên ngoài |
never |
Không bao giờ có giá trị | Khi hàm không trả về hoặc kiểm tra hết các trường hợp |
null / undefined |
Không có giá trị / chưa được gán | Khi biến hoặc thuộc tính có thể trống |
Lời khuyên thực tế
- ✅ Bật
strict: truetrongtsconfig.json. - 🚫 Hạn chế dùng
any, chỉ dùng khi thật cần. - ✅ Ưu tiên
unknownnếu dữ liệu không rõ kiểu. - ✅ Dùng
nevertrongswitchđể tránh quên xử lý trường hợp mới. - ✅ Luôn xử lý
nullvàundefinedrõ ràng.
Kết luận
Những “kiểu đặc biệt” này là vũ khí bí mật giúp TypeScript mạnh mẽ hơn JavaScript rất nhiều.
Hiểu và dùng đúng any, unknown, never, null, undefined sẽ giúp bạn viết code:
- An toàn hơn
- Dễ đọc hơn
- Và ít lỗi “khó tìm” hơn.
All rights reserved