- Reflect - JavaScript | MDN
- The Reflect namespace object contains static methods for invoking interceptable JavaScript object internal methods. The methods are the same as those of proxy handlers.
เมื่อพัฒนาเซิร์ฟเวอร์ด้วย Node.js มักจะได้รับแรงดึงดูดจาก Spring มากมาย
เพราะมันมีโครงสร้างเป็นระบบ มีระเบียบ และยากที่จะเจาะระบบได้ง่ายๆ
ดังนั้น ในฝั่ง Node.js จึงเกิดเฟรมเวิร์กชื่อ Nest.js ขึ้นมา
นั่นคือ ความปรารถนาอย่างมากมายที่อยากจะพัฒนาเซิร์ฟเวอร์ในรูปแบบที่มีโครงสร้างเหมือน Spring
แต่ DI ของ Spring นั้นใช้ Reflection ในขณะรันไทม์เพื่อให้การสนับสนุนการดำเนินการ DI ในระดับภาษา
Dotnet ก็เช่นกัน โดยใช้ Attribute เป็นพื้นฐานในการติดตามและดำเนินการ DI ด้วย Reflection
แล้ว Nest.js ทำการ DI ได้อย่างไร?
Spring และ Dotnet มีภาษาพื้นฐานเป็นภาษาคอมไพล์เลอร์ จึงสนับสนุน Reflection ในระดับภาษาได้ แต่...
ecma script เป็นเพียงภาษาอินเทอร์พรีเตอร์ธรรมดาๆ
ด้านล่างนี้เป็นตัวอย่างหนึ่งจากบทช่วยสอนของ Nest.js
แน่นอนว่าโค้ดที่เขียนด้วย TypeScript นี้ เมื่อคอมไพล์แล้ว แท็กประเภทต่างๆ จะหายไป และจะไม่รู้ประเภทของอาร์กิวเมนต์ที่จำเป็นสำหรับตัวสร้างจากคลาส
ทางออกอยู่ที่สเปคของภาษา
Reflect
โชคดีที่ในระดับภาษา มีฟังก์ชันที่สร้างขึ้นมาเพื่อให้สามารถเพิ่มเมตาข้อมูลลงในแต่ละออบเจ็กต์ได้
เป็นเพียงฟังก์ชันง่ายๆ ที่เพิ่มและดึงเมตาข้อมูลจากออบเจ็กต์
ดังนั้น TypeScript จึงคิดว่า...
ถ้าอย่างนั้น เราจะใส่ข้อมูลประเภทลงในเมตาข้อมูลเมื่อคอมไพล์คลาสไหม?
ดังนั้น TypeScript จึงบันทึกข้อมูลของค่าพารามิเตอร์ที่จำเป็นสำหรับตัวสร้างลงใน Reflect ในทุกๆ ที่ที่มีการใช้คลาสเดโคเรเตอร์
ไม่มีการแปลงหรือเวทมนตร์ดำใดๆ เกี่ยวข้องเลย เป็นเพียงฟังก์ชันของคอมไพล์เลอร์ TypeScript เท่านั้น
เมื่อข้อมูลประเภทของพารามิเตอร์ที่จำเป็นสำหรับตัวสร้างอยู่ในเมตาข้อมูลของคลาสแล้ว
เราสามารถเรียกคลาสและรู้ประเภทได้ ทำให้สามารถใส่ค่าได้อย่างถูกต้อง
สามารถดูการใช้งานได้จาก NestJS แต่เนื่องจากมันซับซ้อนเกินไป ผมจึงขอแนะนำไลบรารี่อื่นๆ
ไลบรารี่นี้พัฒนาโดย microsoft โค้ดจึงค่อนข้างเรียบร้อย
ขอแนะนำให้ลองดู และขอจบการเขียนบทความไว้เพียงเท่านี้
ความคิดเห็น0