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

Generics cơ bản

Generics (lập trình chung) là một trong những tính năng mạnh mẽ nhất của TypeScript. Chúng cho phép bạn viết các thành phần, chức năng và giao diện linh hoạt, có thể tái sử dụng và có thể hoạt động với các loại dữ liệu khác nhau trong khi vẫn duy trì độ an toàn loại tối đa và tránh sử dụng any.


Hàm chung

Hãy nghĩ về một cái chung như một biến cho các loại. Hãy xem xét một hàm trả về giá trị được truyền cho nó dưới dạng đối số:

TS
function identity<T>(arg: T): T {
  return arg;
}

Chữ T (viết tắt của Type) là phần giữ chỗ cho loại. Khi chúng ta gọi identity, TypeScript sẽ ghi lại loại đối số được truyền và tự động đặt T thành loại đó:

TS
const str = identity<string>('Hello'); // T is string
const num = identity(42); // T is number (automatically inferred!)

Giao diện chung và bí danh

Generics cũng có thể được áp dụng cho các giao diện và bí danh loại để xác định các vùng chứa hoặc cấu trúc dữ liệu chung:

TS
interface Box<T> {
  content: T;
}

const stringBox: Box<string> = { content: 'TypeScript' };
const numberBox: Box<number> = { content: 42 };

Nhiều tham số loại

Chúng ta có thể xác định các hàm hoặc loại sử dụng nhiều biến loại (ví dụ: T và U):

TS
function mergeObjects<T, U>(obj1: T, obj2: U): T & U {
  return { ...obj1, ...obj2 };
}

Ràng buộc chung

Đôi khi chúng ta muốn giới hạn các loại được chấp nhận bởi một generic. Chúng ta có thể sử dụng từ khóa extends để thêm ràng buộc.

Ví dụ: nếu chúng ta muốn loại chung luôn có thuộc tính length (như chuỗi hoặc mảng):

TS
interface HasLength {
  length: number;
}

function logLength<T extends HasLength>(arg: T): void {
  console.log(arg.length); // Safe! We know arg has 'length'
}

logLength('Hello'); // Valid
logLength([1, 2, 3]); // Valid
// logLength(42); // Error: number does not have a length property!

Hãy tự mình thử

Bài tập 1: Hàm nhận dạng chung

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

Hoàn thành hàm nhận dạng chung để nó chấp nhận một tham số giá trị thuộc loại chung T và trả về nó mà không sửa đổi.

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

Kiểu trả về phải cùng loại T với tham số.

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

Bài tập 2: Giấy gói hộp chung

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

Xác định giao diện chung có tên Box chấp nhận tham số loại T và có một thuộc tính duy nhất có tên là nội dung thuộc loại T.

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

Sử dụng giao diện Box<T> { content: T; } cú pháp.

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

Bài tập 3: Ràng buộc chung

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

Viết một hàm tổng quát có tên getLength chấp nhận một tham số arg. arg phải được giới hạn ở một giao diện có thuộc tính độ dài (số). Hàm phải trả về arg.length.

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

Khai báo hàm dưới dạng getLength&lt;Tmở rộng HasLength>(arg: T): số và trả về arg.length.

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

Bài tập 4: Cặp chung

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

Xác định một giao diện chung Pair<T, U> với hai thuộc tính: thứ nhất thuộc loại T và thứ hai thuộc loại U. Tiếp theo, tạo một hàm chung makePair chấp nhận thứ nhất (của loại T) và thứ hai (của loại U) và trả về một đối tượng triển khai Pair<T, U>.

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

Sử dụng cú pháp cho hai tham số chung Pair<T, U> và xác định makePair tương ứng.

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