Sử dụng tham số kiểu trong các ràng buộc generic của TypeScript
TypeScript cũng có khả năng khai báo một tham số kiểu sẽ bị ràng buộc bởi một tham số kiểu khác. Điều này cần thiết khi phải sao chép thuộc tính từ một đối tượng này sang một đối tượng khác, đồng thời đảm bảo rằng chúng ta không truyền thừa thuộc tính nào.
Hãy xem xét ví dụ sau. Hãy quay lại
với hàm myFunc, xác định
độ dài của biến:
function myFunc <T> (data: T): T {
console.log(data.length); // lỗi
return data;
}
Tuy nhiên, bây giờ chúng ta muốn hàm này
chỉ hoạt động với các kiểu có
thuộc tính length. Để làm điều này, hãy tạo
interface ILength và gán cho nó
thuộc tính length kiểu number:
interface ILength {
length: number;
}
Tiếp theo, trong hàm của chúng ta, hãy chỉ định kiểu generic
mà kế thừa từ ILength
thông qua từ khóa extends:
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
Đây là toàn bộ mã của chúng ta:
interface ILength {
length: number;
}
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
Hãy kiểm tra hoạt động của hàm chúng ta và tìm độ dài của chuỗi:
console.log(myFunc('abcde'));
Kết quả của mã được thực thi:
5
'abcde'
Và bây giờ hãy truyền một mảng vào tham số:
console.log(myFunc(['a', 'b', 'c']));
Kết quả của mã được thực thi:
3
[ 'a', 'b', 'c' ]