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:
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:
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 property3. 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:
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:
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ị):
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
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.
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
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.
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
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.
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
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.
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ử