ข้อจำกัดของ Generics ใน TypeScript

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

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

ในกรณีนั้นเราแก้ไขสถานการณ์โดยเปลี่ยน ประเภททั่วไปเป็นประเภทของอาร์เรย์ทั่วไป แต่ใน TypeScript มีความเป็นไปได้ที่จะสร้าง ข้อจำกัดให้กับ Generics ได้ ในการทำเช่นนี้ ในเครื่องมุม หลังตัวแปร T เราเขียน คำหลัก extends หลังจากนั้น ในวงเล็บปีกกาเรากำหนดตัวแปรใหม่ str ที่เป็นประเภทสตริง โค้ดที่เหลือของฟังก์ชันจะยังคงเหมือนเดิม โดยไม่มีการเปลี่ยนแปลง:

typescriptfunction myFunc <T extends {str: string}> (data: T): void {
  console.log(data.str.length);
}

ดังนั้น ประเภททั่วไปจะสืบทอดประเภทของ ตัวแปร str ที่ระบุในวงเล็บปีกกา ตอนนี้มาทดสอบการทำงานของ ฟังก์ชันของเรากัน และสร้างตัวแปร myStr ที่อ้างอิงถึงประเภท str และกำหนด ค่าให้มันในวงเล็บปีกกา:

typescriptlet myStr: {str: string} = {str: 'abcde'};

ลองเรียกใช้ฟังก์ชัน myFunc อย่า ลืมระบุประเภทของมันอีกครั้ง และส่ง ตัวแปร myStr เป็นพารามิเตอร์:

typescriptmyFunc <{str: string}> (myStr);
Задание 1

จากตัวอย่างที่พิจารณาในบทเรียน กำหนดฟังก์ชันสำหรับหาความยาวของ อาร์เรย์ตัวเลข