Chuyển đến nội dung chính
Mô-đun 4 · Bài học 2 trong tổng số 28/14 trong khóa học~15 min
Bài học theo mô-đun (2/2)

Các loại tiện ích

TypeScript cung cấp một số loại tiện ích toàn cầu để tạo điều kiện thuận lợi cho việc chuyển đổi loại phổ biến. Những kiểu này là chung và cho phép bạn khai báo các kiểu mới từ những kiểu hiện có.

Bốn loại tiện ích được sử dụng phổ biến nhất là:

1. Partial<T>

Tạo tất cả thuộc tính thuộc loại T tùy chọn. Điều này cực kỳ hữu ích cho các chức năng cập nhật/vá lỗi trong đó người gọi chỉ có thể cung cấp một tập hợp con các trường:

TS
interface User {
  id: number;
  name: string;
  email: string;
}

// All properties of User become optional: { id?: number; name?: string; email?: string; }
type UserUpdate = Partial<User>;

2. Readonly<T>

Tạo tất cả thuộc tính thuộc loại T chỉ đọc. Mọi nỗ lực gán lại thuộc tính sẽ gây ra lỗi trình biên dịch thời gian biên dịch:

TS
interface Point {
  x: number;
  y: number;
}

const p: Readonly<Point> = { x: 10, y: 20 };
// p.x = 5; // Error: cannot assign to 'x' because it is a read-only property

3. Pick<T, Keys>

Tạo một loại bằng cách chỉ chọn một bộ khóa cụ thể (được biểu thị bằng liên kết chuỗi) từ loại T:

TS
interface Article {
  id: number;
  title: string;
  content: string;
  views: number;
}

// Selects only 'title' and 'views': { title: string; views: number; }
type ArticlePreview = Pick<Article, 'title' | 'views'>;

4. Omit<T, Keys>

Tạo một loại bằng cách xóa một bộ khóa cụ thể khỏi loại T. Nó là số kép của Pick:

TS
interface Product {
  id: number;
  name: string;
  price: number;
  secretVendorCode: string;
}

// Removes 'secretVendorCode': { id: number; name: string; price: number; }
type PublicProduct = Omit<Product, 'secretVendorCode'>;

5. Record<Keys, Type>

Tạo một loại đối tượng có khóa thuộc tính là Keys và có giá trị thuộc tính là Type. Nó cực kỳ hữu ích để ánh xạ các khóa tới các giá trị, biểu diễn từ điển hoặc bảng băm (bản đồ khóa-giá trị):

TS
type Page = 'home' | 'about' | 'contact';

interface PageInfo {
  title: string;
}

// Creates a dictionary with keys 'home' | 'about' | 'contact' and values PageInfo
const nav: Record<Page, PageInfo> = {
  home: { title: 'Home Page' },
  about: { title: 'About Us' },
  contact: { title: 'Contact Us' },
};

Hãy tự mình thử

Bài tập 1: Cập nhật hồ sơ một phần

tập thể dục#ts.m4.l2.e1
Nỗ lực: 0Đang tải…

Hoàn thành hàm updateProfile chấp nhận hồ sơ gốc (Hồ sơ) và đối tượng cập nhật (cập nhật) trong đó tất cả các trường của Hồ sơ là tùy chọn. Nó phải trả về một đối tượng Profile mới kết hợp các thuộc tính ban đầu với các bản cập nhật.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Sử dụng loại tiện ích Partial<Profile> cho tham số cập nhật và toán tử trải rộng để hợp nhất các đối tượng: { ...origin, ...updates }.

Giải pháp khả dụng sau 3 lần thử

Bài tập 2: Loại bỏ các trường nhạy cảm bằng Omit

tập thể dục#ts.m4.l2.e2
Nỗ lực: 0Đang tải…

Với loại UserAccount, hãy xác định bí danh loại có tên SafeUser bỏ qua thuộc tính passHash nhạy cảm.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Sử dụng loại SafeUser = Bỏ qua<UserAccount, 'passwordHash'>; để bỏ qua trường được chỉ định.

Giải pháp khả dụng sau 3 lần thử

Bài tập 3: Cấu hình công khai với Pick và Readonly

tập thể dục#ts.m4.l2.e3
Nỗ lực: 0Đang tải…

Với loại AppConfig, hãy xác định bí danh loại có tên PublicConfig là phiên bản chỉ đọc (Chỉ đọc) chỉ chứa các thuộc tính apiEndpoint và cổng được chọn bằng Pick.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Sử dụng loại PublicConfig = Readonly<Pick<AppConfig, 'apiEndpoint' | 'cổng'>>;

Giải pháp khả dụng sau 3 lần thử

Bài tập 4: Đăng ký người dùng với bản ghi và chỉ đọc

tập thể dục#ts.m4.l2.e4
Nỗ lực: 0Đang tải…

Cung cấp giao diện Người dùng với các trường id: số và tên: chuỗi, hãy tạo loại ReadOnlyUser để tạo tất cả các trường trong Người dùng ở chế độ chỉ đọc. Sau đó, tạo một loại UserRegistry đại diện cho một từ điển trong đó khóa là một chuỗi (ví dụ: id chuỗi) và giá trị là ReadOnlyUser.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Sử dụng Readonly<User> để xác định ReadOnlyUser và Record<string, ReadOnlyUser> cho sổ đăng ký.

Giải pháp khả dụng sau 3 lần thử