Generics ขั้นพื้นฐาน
Generics นั้นเป็นคอนเซ็ปท์ที่มีในหลายๆ ภาษาที่เป็น Static Typing อยู่แล้ว เพราะมันทำให้เราสามารถเขียนโค้ดให้ใช้งานซำ้ได้ในหลายๆ Type ขอยกตัวอย่างจากฟังก์ชั่น JavaScript นี้ ที่จะคืนค่าแรกภายใน Array
ลองสังเกตว่า ฟังก์ชั่นนี้รองรับ Array ของ Type ใดก็ได้ ถ้าเรากำหนด Type เฉพาะเจาะจงว่าเป็น number
หรือ integer
จะใช้กับอีกตัวไม่ได้ เช่น
เราอาจใช้ any[]
แทนได้ แต่การคืนค่า any
ออกมา ไม่ใช่เรื่องที่ดี เพราะจะเสียความ Type-safe ไป
การใช้ Generic จะทำให้เรา "จับ" (Capture) Type ที่โยนเข้าไปในฟังก์ชั่น ให้เหมือนกับค่าที่จะ Return ออกมา โดยการใช้สัญลักษณ์ <T>
แล้วนำค่า T
ไปใช้ต่อเป็นพารามิเตอร์ หรือค่า Return ได้ และเราจะเรียก T
ว่าเป็นตัวแปรแบบ "Type Variable" (ไม่ได้บังคับว่าต้องเป็นตัว T สามารถใช้ตัวอื่นได้ แต่ปกติแล้วจะใช้ตัว T เพื่อความเข้าใจตรงกันว่าเป็นตัวแปรสำหรับ Type)
ตัวอย่างนี้เราจะเซ็ตค่า T โดยตรงด้วย number
และ string
แต่ที่จริงแล้วเราไม่ต้องใส่ Type Variable เลยก็ได้ แล้ว TypeScript จะจัดการอนุมาน Type ให้เราเอง เรียกว่า Type Argument Inference
เราสามารถใช้ Type Variable มากกว่าหนึ่งตัวก็ได้ เช่น
ดูจาก Argument ตัวแรกของฟังก์ชั่น map
:
input
เป็นstring[]
arr
ต้องเป็นT[]
ฉะนั้น
T
เป็นstring
ดูจาก Argument ตัวที่สองของฟังก์ชั่น map
:
(s) => parseInt(s)
เป็นฟังก์ช้่นที่ ReturnparseInt()
ซึ่งเป็นฟังก์ชั่นที่จะคืนnumber
func
ต้องเป็น(arg: string) => U
ฉะนั้น
U
เป็นnumber
และค่า Return ของฟังก์ชั่น เป็น U[]
สรุปได้ว่าฟังก์ชั่น map
นี้จะคืนค่าเป็น number[]
หรืออาเรย์ของตัวเลข (เฉพาะในกรณีmap(input, (s) => parseInt(s))
เท่านั้น ถ้าเรียกใช้แบบอื่น ค่า Return จะขึ้นอยู่กับฟังก์ชั่นที่ใส่เข้าไป)
การใช้ Generics นั้นมีความซับซ้อนมาก (ผู้เขียนก็ยังไม่เชี่ยวชาญเท่าไร) เลยขอพักไว้เท่านี้ก่อน โค้ดเริ่มเยอะ
เดี๋ยวจะมีตอนต่อสำหรับ Generics แน่นอนครับ
Last updated
Was this helpful?