Utility Types

ขอทิ้งท้ายคอร์ส TypeScript 101 ด้วย Utility Types หรือ Type ตัวช่วยต่างๆ ที่ TypeScript มีให้ใช้งาน

Partial<Type>

Partial<T> จะรับ Object Type และเปลี่ยน Property ทั้งหมดให้เป็น Optional เพื่อที่เราจะได้ใช้เฉพาะบาง Property ได้

interface Post {
  title: string
  body: string
  imageUrl: string
}

type PostFields = Partial<Post>

// เหมีอนกันกับ
interface PostFields {
  title?: string
  body?: string
  imageUrl?: string
}

function updatePost(post: Post, fields: PostFields) {
  ...
}

const post = { title: "...", body: "...", imageUrl: "..." }

// Update เฉพาะ Body ของ Post
const updatedPost = updatePost(post, { body: "..." }) 

ตัวอย่างนี้ใช้ประโยชน์จาก Partial<Post> เพื่อให้เวลาที่เราอัพเดตตัว Post โดยไม่ต้องใช้ Field ทั้งหมดก็ได้

Pick<Type,Keys>

ใช้เพื่อ Pick (เลือก) เฉพาะ Key ของ Property มาเป็น Object Type ใหม่

// "เลือก" เฉพาะ Property title และ body
type PostTitleAndBody = Pick<Post, "title" | "body">

// เหมือนกันกับ
interface PostTitleAndBody {
  title: string
  body: string
}

function updatePost(post: Post, fields: PostTitleAndBody) { ... }

updatePost(post, { title: "...", body: "..." })

Omit<Type,Keys>

ตรงข้ามกับ Pick คือจะยกเว้น Keys ที่ระบุไว้

// ใช้ทุก Properties ของ Post "ยกเว้น" title
type PostDetails = Omit<Post, "title">

// เหมือนกันกับ
interface PostDetails {
  body: string
  imageUrl: string
}

Record<Keys,Type>

สร้าง Object Type ด้วย Property ที่เป็น Keys และมี Value เป็นประเภทตาม Type

type CodeName = "alpha" | "beta" | "charlie"
type Color = "red" | "green" | "blue" | "white" | "black"

// List ต้องเป็น Object ที่มีชี่อ Property เป็น CodeName 
// และ Value เป็น Object { color: Color }
type CodeWithColor = Record<CodeName, { color: Color }>

const codes: CodeWithColor = {
  alpha: { color: "blue" }
  beta: { color: "red" }
}

Parameters<FunctionType>

ดึง Type ของ Parameters ออกมาจาก Function ออกมาเป็น Tuple (Array)

// (a: number, b: number) => number
function sum(a: number, b: number) { return a + b }

type SumParams = Parameters<sum> // ❌ ต้องใช้ Type ไม่ใช่ใส่ function เข้าไปโดยตรง
type SumParams = Parameters<typeof sum> // ✅ ใช้ typeof เพื่อดึง Type จาก function

// เหมือนกันกับ
type SumParams = [a: number, b: number] // Tuple ที่มี 2 ตัว

ReturnType<FunctionType>

ดึง Type ของค่า Return จาก Function

// (a: number, b: number) => number
function sum(a: number, b: number) { return a + b }

type SumReturn = ReturnType<typeof sum> // number

// (msg: string) => void
function log(msg) { console.log(`LOG : ${msg}`) }

type LogReturn = ReturnType<typeof log> // void

Utility Types ยังมีอีกหลายตัว ดูทั้งหมดได้จาก Official Docs ซึ่งจะช่วยให้เราใช้ประโยชน์จาก Type ที่มีอยู่แล้ว หรือ Import มาจาก Library ต่างๆ ได้โดยไม่ต้องกำหนด Generic Type ที่ซับซ้อนเองทั้งหมด

Last updated