hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Cấu trúc dữ liệu và giải thuật
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
      • NodeJS
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
      • MongoDB
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
    • Lập trình C#
      • Lập Trình C# Cơ Bản
      • ASP.NET Core MVC
    • Machine Learning
    • Git và Github
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • Typescript cơ bản
TypeScript cơ bản – Null, undefined, narrowing và type guards

TypeScript cơ bản – Null, undefined, narrowing và type guards

  • 17-10-2026
  • Toanngo92
  • 0 Comments

Một biến mang union type không cho phép gọi mọi phương thức của các kiểu thành viên. TypeScript cần bằng chứng về giá trị tại vị trí đang dùng. Narrowing là quá trình thu hẹp kiểu dựa trên luồng điều khiển, chẳng hạn điều kiện if hoặc switch. Đây là cách xử lý dữ liệu an toàn hơn việc chuyển mọi thứ thành any.

Mục lục

  • 1. Phân biệt null và undefined
  • 2. Thu hẹp bằng typeof và kiểm tra giá trị
  • 3. Discriminated union cho các trạng thái
  • 4. Type guard tự viết cho unknown
  • 5. Vì sao không dùng as hoặc dấu ! để bỏ lỗi?
  • Đọc tiếp trong loạt bài

1. Phân biệt null và undefined

Undefined thường xuất hiện khi chưa có giá trị, truy cập thuộc tính không tồn tại hoặc hàm không trả kết quả. Null thường được dùng để biểu thị rõ trạng thái không có dữ liệu. Cách quy ước tùy ứng dụng, nhưng khi bật strictNullChecks thông qua strict, cả hai cần được xét riêng trước khi dùng như một string hay object chắc chắn tồn tại.

function displayName(value: string | null | undefined): string {
  return value?.trim() || "Khách";
}
console.log(displayName(null)); // Khách
console.log(displayName(" An ")); // An

Ví dụ dùng || vì muốn thay cả chuỗi rỗng sau trim. Nếu cần giữ chuỗi rỗng, số 0 hoặc false, hãy cân nhắc ??; toán tử này chỉ thay null và undefined. Optional chaining ?. dừng truy cập khi gặp null/undefined tại vị trí được kiểm tra, không xác thực cấu trúc của một JSON bất kỳ.

2. Thu hẹp bằng typeof và kiểm tra giá trị

function formatId(id: string | number): string {
  if (typeof id === "string") {
    return id.trim().toUpperCase();
  }
  return id.toFixed(0);
}

Sau khi nhánh string đã return, phần còn lại chỉ xử lý number. TypeScript theo dõi luồng này nên không cần ép kiểu. Có thể dùng instanceof cho instance của class và toán tử in để kiểm tra sự tồn tại của thuộc tính; tuy nhiên một thuộc tính có tồn tại chưa đồng nghĩa giá trị của nó đúng kiểu.

Khi kiểm tra object, nhớ rằng typeof null === "object". Vì vậy typeof value === "object" cần kết hợp value !== null trước khi truy cập thuộc tính. Cũng đừng dùng if (value) nếu bạn cần giữ lại 0, false hoặc chuỗi rỗng hợp lệ.

3. Discriminated union cho các trạng thái

type LoadState =
  | { status: "loading" }
  | { status: "success"; title: string }
  | { status: "error"; message: string };

function describe(state: LoadState): string {
  switch (state.status) {
    case "loading": return "Đang tải";
    case "success": return state.title;
    case "error": return state.message;
    default: {
      const impossible: never = state;
      return impossible;
    }
  }
}

Status là thuộc tính phân biệt: từng giá trị literal gắn với một cấu trúc tương ứng. Chỉ nhánh success có title; chỉ nhánh error có message. Nhánh default gán vào never để trình biên dịch nhắc khi bạn thêm một trạng thái nhưng quên xử lý. Không cần khai báo một object có tất cả trường optional rồi đoán trường nào hiện có.

4. Type guard tự viết cho unknown

interface Student { name: string; }

function isStudent(value: unknown): value is Student {
  return typeof value === "object" && value !== null &&
    "name" in value && typeof value.name === "string";
}

const payload: unknown = { name: "An" };
if (isStudent(payload)) {
  console.log(payload.name.toUpperCase()); // AN
}

Phần value is Student là type predicate. Khi hàm trả true, TypeScript tin rằng value là Student. Vì vậy logic bên trong phải kiểm tra đủ các trường mà Student yêu cầu; viết một hàm luôn trả true sẽ làm mất ý nghĩa kiểm tra. Dữ liệu lồng nhau, mảng và quy tắc nghiệp vụ cũng cần được kiểm tra nếu kiểu của bạn có chúng.

5. Vì sao không dùng as hoặc dấu ! để bỏ lỗi?

as Student và non-null assertion ! không tạo kiểm tra khi chạy. Chúng thể hiện lời khẳng định của lập trình viên với trình biên dịch; nếu khẳng định sai, ứng dụng vẫn lỗi. Hãy ưu tiên điều kiện kiểm tra hoặc trả về sớm. Chạy các ví dụ với cấu hình strict ở bài đầu; giữ dòng export {} cuối file để cô lập phạm vi.

Đọc thêm: TypeScript: Narrowing.

Đọc tiếp trong loạt bài

Bài trước: TypeScript cơ bản – Type và interface: mô tả cấu trúc dữ liệu

Bài tiếp theo: TypeScript cơ bản – Generics và keyof: tái sử dụng mà vẫn giữ kiểu

Xem chuyên mục TypeScript cơ bản

Bài viết liên quan:

TypeScript với Kiểu Dữ Liệu Cơ Bản – 3
TypeScript với Kiểu Dữ Liệu Cơ Bản – 2
TypeScript với Kiểu Dữ Liệu Cơ Bản – 1
Typescript cơ bản và cách cài đặt cho người mới

THÊM BÌNH LUẬN Cancel reply

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

TypeScript cơ bản – Class, constructor, phạm vi truy cập và implements

TypeScript cơ bản – Promise, async/await và kiểm tra dữ liệu API

TypeScript cơ bản – DOM, sự kiện và biểu mẫu trên trình duyệt

TypeScript cơ bản – Module, import, export và tổ chức nhiều file

TypeScript cơ bản – Generics và keyof: tái sử dụng mà vẫn giữ kiểu

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×