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
      • Spring Boot
    • Lập trình C#
      • Lập Trình C# Cơ Bản
      • ASP.NET Core MVC
    • Lập trình Python
    • Git và Github
    • Machine Learning
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
    • Mạng và truyền thông
  • 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 – Promise, async/await và kiểm tra dữ liệu API

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

  • 17-10-2026
  • Toanngo92
  • 0 Comments

Khi đọc dữ liệu từ server, ứng dụng không có kết quả ngay lập tức. Promise mô tả một tác vụ sẽ hoàn thành hoặc thất bại trong tương lai; async/await giúp viết phần sử dụng kết quả theo thứ tự dễ đọc. TypeScript bổ sung thông tin về kiểu kết quả, nhưng dữ liệu thật từ mạng vẫn cần được kiểm tra.

Mục lục

  • 1. Kiểu trả về của hàm async
  • 2. Mô tả dữ liệu muốn sử dụng
  • 3. Kiểm tra dữ liệu unknown
  • 4. Gọi fetch và kiểm tra HTTP
  • 5. Sử dụng kết quả và xử lý lỗi
  • 6. Không dùng ép kiểu thay cho xác thực
  • Đọc tiếp trong loạt bài

1. Kiểu trả về của hàm async

async function getTitle(): Promise<string> {
  return "TypeScript cơ bản";
}
async function showTitle(): Promise<void> {
  const title = await getTitle();
  console.log(title.toUpperCase());
}
void showTitle();

GetTitle trả về Promise<string>, dù câu lệnh return viết một chuỗi. Sau await, title là string. Hàm async không tạo kết quả nghiệp vụ có thể khai báo Promise<void>. Await không chặn toàn bộ luồng giao diện trong lúc chờ mạng; nó tạm dừng phần tiếp theo của hàm async hiện tại.

2. Mô tả dữ liệu muốn sử dụng

interface PostSummary {
  id: number;
  title: string;
}

Ví dụ sử dụng JSONPlaceholder, một API minh họa công khai không cần gửi thông tin đăng nhập. API có thể trả thêm trường khác; ứng dụng này chỉ cần id và title. Định nghĩa interface không buộc server trả đúng hai trường đó và cũng không xóa các trường còn lại khỏi object.

3. Kiểm tra dữ liệu unknown

function isPostSummary(value: unknown): value is PostSummary {
  return typeof value === "object" && value !== null &&
    "id" in value && typeof value.id === "number" && Number.isFinite(value.id) &&
    "title" in value && typeof value.title === "string";
}

Dữ liệu được giữ ở kiểu unknown cho đến khi có kiểm tra. Hàm trên xác nhận object khác null, id là số hữu hạn và title là chuỗi. Đây là yêu cầu tối thiểu của PostSummary; nếu ứng dụng cần id nguyên dương hoặc title không rỗng, phải bổ sung điều kiện nghiệp vụ. Dữ liệu lồng nhau cũng cần kiểm tra tương ứng.

4. Gọi fetch và kiểm tra HTTP

async function loadPost(url: string): Promise<PostSummary> {
  const response = await fetch(url);
  if (!response.ok) {
    throw new Error("HTTP " + response.status);
  }
  const data: unknown = await response.json();
  if (!isPostSummary(data)) {
    throw new Error("Dữ liệu bài viết không đúng cấu trúc");
  }
  return data;
}

Fetch có thể thất bại do mạng; response.json() có thể thất bại vì nội dung không phải JSON. Với HTTP 404 hoặc 500, fetch thông thường vẫn tạo Response, vì vậy cần kiểm tra response.ok. Khi type guard trả true, data được thu hẹp thành PostSummary và có thể được trả lại từ hàm.

5. Sử dụng kết quả và xử lý lỗi

async function main(): Promise<void> {
  try {
    const post = await loadPost("https://jsonplaceholder.typicode.com/posts/1");
    console.log(post.id, post.title);
  } catch (error: unknown) {
    console.error(
      error instanceof Error ? error.message : "Có lỗi không xác định"
    );
  }
}
void main();
export {};

Ghép các khai báo PostSummary, isPostSummary, loadPost và main vào src/main.ts. Biên dịch theo bài cấu hình, rồi chạy bằng phiên bản Node.js có fetch tích hợp hoặc trên trình duyệt hiện đại. Ví dụ cần kết nối Internet và phụ thuộc việc API minh họa đang hoạt động. Trong catch, giá trị được ném có thể không phải Error, nên phải kiểm tra trước khi đọc message.

Void trước main diễn đạt rằng nơi gọi không dùng giá trị Promise; nó không tự bắt lỗi. Ở ví dụ này, lỗi của thao tác tải đã được xử lý trong main. Với một hàm khác chưa có try/catch, vẫn cần await hoặc .catch để xử lý Promise bị từ chối.

6. Không dùng ép kiểu thay cho xác thực

Viết const data = await response.json() as PostSummary không kiểm tra id hay title lúc chạy. Tương tự, một hàm getJson<T>() chỉ ép kết quả thành T cũng không chứng minh dữ liệu đúng. Với API thật, hãy dùng type guard hoặc công cụ xác thực phù hợp, đồng thời phân biệt rõ lỗi mạng, lỗi HTTP và lỗi cấu trúc dữ liệu.

Đọc thêm: MDN: Using the Fetch API.

Đọc thêm: TypeScript: Narrowing.

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

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

Bài tiếp theo: TypeScript cơ bản – Class, constructor, phạm vi truy cập và implements

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

Bài viết liên quan:

TypeScript cơ bản – Class, constructor, phạm vi truy cập và implements
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
TypeScript cơ bản – Null, undefined, narrowing và type guards
TypeScript cơ bản – Type và interface: mô tả cấu trúc dữ liệu
TypeScript cơ bản – Hàm, kiểu tham số, giá trị trả về và callback
TypeScript cơ bản – Chạy chương trình đầu tiên và cấu hình tsconfig.json
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

Kiến trúc máy tính: CPU, RAM, ALU, bus và bộ nhớ cache

Kiến trúc máy tính – Bài 4: RAM, cache và bộ nhớ ảo khác nhau thế nào?

Kiến trúc máy tính: CPU, RAM, ALU, bus và bộ nhớ cache

Kiến trúc máy tính – Bài 3: CPU điều khiển và trao đổi dữ liệu qua bus thế nào?

Kiến trúc máy tính: CPU, RAM, ALU, bus và bộ nhớ cache

Kiến trúc máy tính – Bài 5: Thiết bị vào/ra, ngắt, DMA và RAID

Kiến trúc máy tính: CPU, RAM, ALU, bus và bộ nhớ cache

Kiến trúc máy tính – Bài 2: CPU thực hiện phép tính 5 + 3 như thế nào?

Kiến trúc máy tính: CPU, RAM, ALU, bus và bộ nhớ cache

Kiến trúc máy tính – Bài 1: Máy tính hoạt động như thế nào?

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
×