Skip to content

Generics ของ TypeScript อธิบาย

รูปแบบ generics ที่คุณหยิบมาใช้บ่อย จัดกลุ่มตามหน้าที่: ประกาศพารามิเตอร์ประเภท กำหนดขอบเขตให้มัน ตั้งค่าเริ่มต้น แยกทางด้วยเงื่อนไข จับประเภทด้วย infer และแมปบนรูปร่างหนึ่ง แต่ละแถวจับคู่รูปแบบกับตัวอย่างหนึ่งบรรทัด

generic คือพารามิเตอร์ประเภท: ที่ว่างสำหรับประเภทที่ผู้เรียกเลือก ทำให้ฟังก์ชันหรือประเภทเดียวใช้ได้กับหลายรูปร่างโดยไม่เสียความแม่นยำ อ่าน <T> ว่า "สำหรับประเภท T ใด ๆ" พลังของมันมาจากการกำหนดขอบเขต T การแยกทางบนมัน และการแมปมัน รูปแบบด้านล่างคือคลังคำศัพท์ที่ใช้งานจริง

ตารางอ้างอิง · 28 รายการ
28 of 28 rows
ประกาศ
พารามิเตอร์ประเภทที่ผู้เรียกเป็นคนเลือกfunction first<T>(xs: T[]): T
พารามิเตอร์ประเภทหลายตัวที่ไม่ขึ้นต่อกันfunction pair<T, U>(a: T, b: U): [T, U]
พารามิเตอร์ตัวที่สองผูกกับคีย์ของตัวแรกfunction get<T, K extends keyof T>(o: T, k: K): T[K]
คลาสที่มีพารามิเตอร์ประเภทบนฟิลด์และเมธอดของมันclass Box<T> { value: T }
รูปร่างออบเจ็กต์ที่มีพารามิเตอร์ประเภทinterface Result<T> { data: T }
พารามิเตอร์ประเภทบน arrow function; จุลภาคต่อท้ายกันไฟล์ .tsx อ่านมันเป็น JSXconst first = <T,>(xs: T[]): T => xs[0]
กำหนดขอบเขต
กำหนดให้ T ต้อง assign ให้ Type ได้function len<T extends { length: number }>(x: T)
จำกัด T ให้เป็นคีย์ของประเภทอื่นtype Keys<O> = keyof O
จำกัด T ให้เป็นคลาสที่ construct ได้function make<C extends new () => C>(c: C): C
กำหนดให้ T ต้องผ่านหลายข้อจำกัดพร้อมกันfunction log<T extends Error & { code: number }>(e: T)
จำกัดด้วยอะไรก็ได้; คงพารามิเตอร์เป็น generic โดยไม่ตัดให้แคบลงtype Wrap<T> = T extends unknown ? { v: T } : never
ค่าเริ่มต้น & infer
ให้ค่าเริ่มต้นแก่ T เมื่อผู้เรียกไม่ระบุfunction parse<T = string>(): T
จับประเภทหนึ่งไว้ภายใน conditionaltype El<T> = T extends Array<infer I> ? I : never
คลาย Promise ที่ซ้อนกันออกเป็นประเภทชั้นในของมันtype Data = Awaited<Promise<User>>
จับชิ้นส่วนหนึ่งของ template literal typetype Path<S> = S extends `/api/${infer R}` ? R : never
ตรวจ union ทั้งหมดในครั้งเดียว; T เปลือย infer ทีละสมาชิกtype El<T> = [T] extends [Array<infer I>] ? I : never
เงื่อนไข & แมป
เลือกประเภทตามว่า T assign ให้ U ได้หรือไม่type IsStr<T> = T extends string ? true : false
สร้างประเภทออบเจ็กต์ใหม่โดยแปลงทุกคีย์ของ Ttype Frozen<T> = { [K in keyof T]: Readonly<T[K]> }
ออบเจ็กต์ที่คีย์เป็น K และค่าเป็น Vtype Scores = Record<string, number>
generic ในตัวที่ได้จากรูปแบบข้างต้นtype Preview = Pick<User, "id" | "name">
T เปลือยก่อน extends รันทีละสมาชิกของ union แล้วรวมผลลัพธ์เข้าด้วยกันToArray<'a' | 'b'> = 'a'[] | 'b'[]
เพิ่มหรือลบ modifier บนคีย์ที่แมปtype Req<T> = { [K in keyof T]-?: T[K] }
คีย์ของค่า runtime ในรูปของประเภทconst opts = { a: 1 }; type K = keyof typeof opts
สร้างประเภทสตริงจากประเภทสตริงอื่นtype Route = `/users/${string}`
ต่อประเภท tuple หัวท้ายเข้าด้วยกันtype Concat<T extends unknown[], U extends unknown[]> = [...T, ...U]
ประเภทที่นิยามอ้างถึงตัวมันเองtype Json = string | number | Json[] | { [k: string]: Json }
ตรวจค่ากับประเภทและคง literal type ที่แคบกว่าของมันไว้const c = { dark: "#000" } satisfies Record<string, string>
คง literal type ที่ผู้เรียกส่งมาแทนที่จะขยายมัน (TS 5.0)function first<const T>(xs: readonly T[]): T