ค้นหาเว็บไซต์

typescript - มีวิธีใดบ้างที่จะห่อฟังก์ชัน import() อย่างปลอดภัยต่อประเภท?


นิพจน์ import() ของ TypeScript ช่วยให้สามารถโหลดโค้ดแบบ lazy ในเวลารันไทม์ได้ ตัวอย่างเช่น ฉันสามารถเรียก await import('@my-app/a/b') และได้รับอ็อบเจ็กต์ที่มีสมาชิกตรงตามที่ส่งออกจากโมดูลต้นทางที่อ้างอิง

นี่เป็นการตรวจสอบประเภทอย่างปลอดภัย; คอมไพเลอร์ TypeScript จะทราบในเวลาการออกแบบว่าสมาชิกใดบ้างที่จะสามารถใช้งานได้บนอ็อบเจ็กต์ที่ส่งคืนตามเส้นทาง

มีวิธีใดที่จะห่อหุ้ม import() นิพจน์นี้และยังคงได้รับวัตถุที่มีการพิมพ์แบบเข้มงวดอยู่หรือไม่?

กรณีการใช้งานจะเป็นเพื่อให้ฉันสามารถดำเนินการบางอย่างมาตรฐานบนวัตถุที่ถูกส่งกลับมาก่อนที่จะส่งกลับไปยังโค้ดที่เรียกใช้งาน

ตัวอย่างเช่น:

การใช้โมดูลที่โหลดแบบเฉยๆ โดยไม่เตรียมล่วงหน้า:

const module = await import('@my-app/a/b');
module.doSomething();

ใช้โมดูลแบบโหลดตามความจำเป็นหลังจากทำงานมาตรฐานเสร็จแล้ว:

const module = await loadAndProcessModule('@my-app/a/b');
module.doSomething();

คำถามคือวิธีการทำให้ loadAndProcessModule ทำงาน หรืออย่างน้อยประกาศมัน โดยไม่ทำให้ความปลอดภัยของชนิดข้อมูลเสียหาย

คำตอบ #1

ฉันคิดว่าเพื่อที่จะทำสิ่งนี้ คุณจะต้องสามารถแสดง typeof import("module-specifier") เป็นเจเนอริกได้ เช่น ลายเซ็นของฟังก์ชัน loadAndProcessModule ของคุณจะต้องมีลักษณะประมาณนี้:

function loadAndProcessModule<T extends string>(moduleSpecifier: T): typeof import(T) {
   // ...
}

น่าเสียดายที่สิ่งนี้ไม่สามารถทำได้ใน Typescript ปัจจุบัน - ดูคำถามนี้และคำขอฟีเจอร์ที่เปิดอยู่