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

Các loại được ánh xạ

Các loại được ánh xạ cho phép bạn tạo các loại mới bằng cách chuyển đổi từng thuộc tính của các loại hiện có. Chúng được xây dựng dựa trên cú pháp vòng lặp trên các khóa bằng toán tử keyof.

TS
type Mapped<T> = {
  [P in keyof T]: T[P];
};

Ví dụ này hiển thị loại được ánh xạ giống hệt với loại ban đầu: nó lặp qua từng khóa P trong keyof T và gán cùng loại T[P].


Công cụ sửa đổi khả năng thay đổi và tùy chọn

Chúng tôi có thể thêm hoặc xóa các công cụ sửa đổi như readonly và ? (tùy chọn) bằng cách đặt trước chúng + (thêm, mặc định) hoặc - (xóa).

Ví dụ: để loại bỏ tính tùy chọn khỏi tất cả các thuộc tính của một loại (làm cho chúng trở thành bắt buộc):

TS
type Concrete<T> = {
  [P in keyof T]-?: T[P];
};

Công cụ sửa đổi -? sẽ xóa cờ tùy chọn khỏi mỗi thuộc tính.


Ánh xạ lại khóa bằng as

Trong TypeScript 4.1+, bạn có thể ánh xạ lại các khóa trong loại được ánh xạ bằng cách sử dụng mệnh đề as và các loại chữ mẫu.

TS
type WriteSetters<T> = {
  [K in keyof T as `set${Capitalize<string & K>}`]: (value: T[K]) => void;
};

Ở đây, chúng tôi sẽ đổi tên của từng thuộc tính K thành set[CapitalizedKey] và sửa đổi loại của nó thành hàm setter.


Hãy tự mình thử

Bài tập 1: Làm cho các thuộc tính có thể rỗng

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

Khai báo một loại ánh xạ chung Nullable<T> nhận một đối tượng T và biến đổi mọi thuộc tính để nó cũng có thể chấp nhận giá trị null (ví dụ: T[K] | null).

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

Sử dụng cú pháp [K trong keyof T]: T[K] | vô giá trị; bên trong đối tượng loại được ánh xạ.

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

Bài tập 2: Tạo Dynamic Getters với as

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

Tạo một loại được ánh xạ có tên GetterNames<T> để biến đổi các khóa của đối tượng T bằng cách thêm tiền tố 'get' vào trước chúng và viết hoa khóa gốc (sử dụng Viết hoa). Ví dụ: nếu khóa là tên thì nó sẽ trở thành getName. Đặt loại thuộc tính thành () => T[K].

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

Sử dụng as \`get\${Capitalize<string & K>}\` để ánh xạ lại khóa và () => T[K] làm kiểu trả về thuộc tính.

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