ลองสังเกตว่า ฟังก์ชั่นนี้รองรับ Array ของ Type ใดก็ได้ ถ้าเรากำหนด Type เฉพาะเจาะจงว่าเป็น number หรือ integer จะใช้กับอีกตัวไม่ได้ เช่น
// TypeScriptfunctiongetFirst(arr:number[]):number{returnarr[0]}getFirst([1,2,3]) // 1getFirst(["One","Two","Three","Four","Five"]) // Type Error
เราอาจใช้ any[] แทนได้ แต่การคืนค่า any ออกมา ไม่ใช่เรื่องที่ดี เพราะจะเสียความ Type-safe ไป
functiongetFirst(arr:any[]):any{returnarr[0]}consta=getFirst([1,2,3]) // a: anyconstb=getFirst(["One","Two","Three","Four","Five"]) // b: any
การใช้ 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) เป็นฟังก์ช้่นที่ Return parseInt() ซึ่งเป็นฟังก์ชั่นที่จะคืน number