Union Types และ Intersection Types
มีบ่อยครั้งที่ Type ที่สร้างขึ้นมาจะไม่ครอบคลุมการใช้งานได้ทั้งหมด หรือมีความต้องการที่จะใช้ตัวแปรเก็บค ่าที่มีความซับซ้อนมากขึ้น เราสามารถใช้ Union Types และ Intersection Types มาช่วยได้
สำหรับการ Union เคยเกริ่นไปแล้วในบทก่อน (Literal Types) คือการใช้
|
เพื่อเชื่อม Type เข้าด้วยกัน ทำให้ Type ที่สร้างขึ้นใหม่มีความยืดหยุ่นมากขึ้นtype ID = string | number // ID สามารถเป็น string `หรือ` ตัวเลขก็ได้
const a: ID = "abc"
const b: ID = 101
เราจะนำ Union ไปเขียนเป็น Inline ในฟังก์ชั่นก็ได้เช่นกัน
function sayHello(people: string | string[]) { // รับ string หรือชุดอาเรย์ของ string
...
}
เมื่อใช้ Union แล้วต้องการใช้ตัวแปรนั้น จะต้องทำการเช็ค Type ก่อนในโค้ด เรียกว่าการ Narrowing เช่นตามตัวอย่าง
people
อาจเป็น String หรือ Array ก็ได้ ถ้าไม่เช็คแล้วใช้ Function กับตัวแปรนั้น อาจมี Error เกิดขึ้นได้function sayHello(people: string | string[]) {
console.log(`สวัสดี ${people.join(", ")}`)
}
sayHello(["เจน", "นุุ่น"]) // ✅ สวัสดี เจน, นุ่น
sayHello("โบว์") // ❌ Error

ไม่สามารถใช้ join() ได้ เพราะถ้า people เป็น String จะเกิด Runtime error
จากตัวอย่างข้างต้น ต้องทำการแก้ไขโค้ดให้รองรับทุก Type ที่ Union กัน เช่น
function sayHello(people: string | string[]) {
if (typeof people == "string") {
console.log(`สวัสดี ${people} มาคนเดียวเหรอ`)
} else {
console.log(`สวัสดี ${people.join(", ")}`)
}
}
sayHello(["