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 ปัจจุบัน - ดูคำถามนี้และคำขอฟีเจอร์ที่เปิดอยู่
