การใช้พารามิเตอร์ประเภทในข้อจำกัดของ Generics ใน TypeScript

นอกจากนี้ใน TypeScript ยังมีความเป็นไปได้ ในการประกาศพารามิเตอร์ประเภทหนึ่ง ซึ่งจะถูกจำกัดด้วยพารามิเตอร์ประเภทอื่น สิ่งนี้จำเป็นเมื่อต้องคัดลอกคุณสมบัติจากอ็อบเจกต์หนึ่ง ไปยังอีกอ็อบเจกต์หนึ่ง ในขณะเดียวกันก็ป้องกัน ไม่ให้ส่งคุณสมบัติที่เกินจำเป็น

ลองพิจารณาตัวอย่างต่อไปนี้ กลับมาที่ฟังก์ชัน myFunc ซึ่งกำหนดความยาวของตัวแปร:

typescriptfunction myFunc <T> (data: T): T {
  console.log(data.length); // ข้อผิดพลาด
  return data;
}

อย่างไรก็ตาม ตอนนี้เราต้องการให้ฟังก์ชันนี้ ทำงานกับประเภทที่มีคุณสมบัติ length เท่านั้น ในการนี้เราจะสร้างอินเทอร์เฟซ ILength และกำหนดคุณสมบัติ length เป็นประเภทตัวเลข:

typescriptinterface ILength {
  length: number;
}

ต่อไปในฟังก์ชันของเรา เราจะกำหนดประเภทเจเนอริก ที่สืบทอดจาก ILength โดยใช้คำสำคัญ extends:

typescriptfunction myFunc <T extends ILength> (data: T): T {
  console.log(data.length);
  return data;
}

นี่คือโค้ดเต็มของเรา:

typescriptinterface ILength {
  length: number;
}

function myFunc <T extends ILength> (data: T): T {
  console.log(data.length);
  return data;
}

ลองทดสอบการทำงานของฟังก์ชันของเราและ หาความยาวของสตริง:

typescriptconsole.log(myFunc('abcde'));

ผลลัพธ์ของการดำเนินการโค้ด:

typescript5
'abcde'

และตอนนี้เรามาส่งอาร์เรย์ในพารามิเตอร์:

typescriptconsole.log(myFunc(['a', 'b', 'c']));

ผลลัพธ์ของการดำเนินการโค้ด:

typescript3
[ 'a', 'b', 'c' ]