Hạn chế của Generics trong TypeScript
Trong một bài học trước, chúng ta đã tạo một hàm kiểu tổng quát, nhiệm vụ của nó là hiển thị độ dài của tham số được truyền vào. Tuy nhiên, khi biên dịch, chúng ta đã gặp lỗi vì không phải tất cả các kiểu đều có thể có thuộc tính length:
function myFunc < T > (data: T): T {
console.log(data.length); // lỗi
return data;
}
Trong trường hợp đó, chúng ta đã sửa tình huống
bằng cách thay đổi kiểu tổng quát thành kiểu
mảng tổng quát. Nhưng trong TypeScript có một
cách để tạo ra các ràng buộc cho generics. Để
làm điều này, trong dấu ngoặc nhọn, sau biến
T, chúng ta viết từ khóa
extends. Sau đó, trong dấu ngoặc nhọn
chúng ta khai báo một biến mới
str thuộc kiểu string.
Phần còn lại của mã hàm sẽ giữ nguyên:
function myFunc <T extends {str: string}> (data: T): void {
console.log(data.str.length);
}
Kết quả là, kiểu tổng quát kế thừa kiểu của
biến str được chỉ định trong dấu ngoặc
nhọn. Bây giờ hãy kiểm tra hoạt động của
hàm chúng ta và tạo một biến
myStr,
tham chiếu đến kiểu str, và gán
cho nó một giá trị trong dấu ngoặc nhọn:
let myStr: {str: string} = {str: 'abcde'};
Hãy gọi hàm myFunc, đừng
quên chỉ định lại kiểu của nó và truyền
biến myStr làm tham số:
myFunc <{str: string}> (myStr);
Dựa trên ví dụ được xem xét trong bài học, hãy tạo một hàm để tìm độ dài của một mảng số.