การใช้พารามิเตอร์ประเภทในข้อจำกัดของ Generics ใน TypeScript
นอกจากนี้ใน TypeScript ยังมีความเป็นไปได้ ในการประกาศพารามิเตอร์ประเภทหนึ่ง ซึ่งจะถูกจำกัดด้วยพารามิเตอร์ประเภทอื่น สิ่งนี้จำเป็นเมื่อต้องคัดลอกคุณสมบัติจากอ็อบเจกต์หนึ่ง ไปยังอีกอ็อบเจกต์หนึ่ง ในขณะเดียวกันก็ป้องกัน ไม่ให้ส่งคุณสมบัติที่เกินจำเป็น
ลองพิจารณาตัวอย่างต่อไปนี้ กลับมาที่ฟังก์ชัน
myFunc ซึ่งกำหนดความยาวของตัวแปร:
function myFunc <T> (data: T): T {
console.log(data.length); // ข้อผิดพลาด
return data;
}
อย่างไรก็ตาม ตอนนี้เราต้องการให้ฟังก์ชันนี้
ทำงานกับประเภทที่มีคุณสมบัติ length
เท่านั้น ในการนี้เราจะสร้างอินเทอร์เฟซ
ILength และกำหนดคุณสมบัติ
length เป็นประเภทตัวเลข:
interface ILength {
length: number;
}
ต่อไปในฟังก์ชันของเรา เราจะกำหนดประเภทเจเนอริก
ที่สืบทอดจาก ILength
โดยใช้คำสำคัญ extends:
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
นี่คือโค้ดเต็มของเรา:
interface ILength {
length: number;
}
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
ลองทดสอบการทำงานของฟังก์ชันของเราและ หาความยาวของสตริง:
console.log(myFunc('abcde'));
ผลลัพธ์ของการดำเนินการโค้ด:
5
'abcde'
และตอนนี้เรามาส่งอาร์เรย์ในพารามิเตอร์:
console.log(myFunc(['a', 'b', 'c']));
ผลลัพธ์ของการดำเนินการโค้ด:
3
[ 'a', 'b', 'c' ]