ชนิดข้อมูลแบรนด์/ชนิดข้อมูลทึบเพื่อป้องกันการสับสนของหน่วย
ป้องกันการสับสนของหน่วยหรือป้ายกำกับด้วยการผนวกชนิดข้อมูลพื้นฐานเข้ากับคุณสมบัติแบรนด์จำลอง และสร้างค่าผ่านฟังก์ชันโรงงานเท่านั้น
ชนิดข้อมูลแบรนด์/ชนิดข้อมูลทึบเพื่อป้องกันการสับสนของหน่วย เป็นบทเรียน TypeScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน TypeScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 3 บทเรียน
บทนำ
เป้าหมาย: แยกค่าที่มีลักษณะคล้ายกันในระดับชนิดข้อมูล number ธรรมดาไม่สามารถบอกความแตกต่างระหว่างเมตรกับวินาทีได้ แต่เครื่องหมายแบรนด์ทำได้
- ไม่มีค่าใช้จ่ายขณะทำงาน
- APIs และการปรับโครงสร้างใหม่ปลอดภัยยิ่งขึ้น
- สร้างผ่านฟังก์ชันโรงงานเท่านั้น
สร้างแบรนด์ให้หน่วยพื้นฐาน
เครื่องหมายแบรนด์ช่วยแยกหน่วยออกจากกันขณะคอมไพล์ ลำดับอาร์กิวเมนต์ที่ผิดจะไม่ผ่านการตรวจสอบชนิดข้อมูล
type Meter = number & { readonly __brand: "meter" }
type Second = number & { readonly __brand: "second" }
function meter(n: number): Meter { return n as Meter }
function second(n: number): Second { return n as Second }
const d = meter(100)
const t = second(9)
function speed(dist: Meter, time: Second) { return (dist as number) / (time as number) }
// speed(t, d) // compile error: brands do not matchตัวช่วยแบรนด์แบบเจเนอริก
ใช้ตัวช่วย Brand แบบเจเนอริกกับโดเมนต่าง ๆ เช่น ID ที่มีชนิดข้อมูลกำกับ โทเค็น และเคอร์เซอร์
type Brand<Tag extends string, T> = T & { readonly __brand: Tag }
type UserId = Brand<"UserId", string>
type OrderId = Brand<"OrderId", string>
function userId(x: string): UserId { return x as UserId }
function orderId(x: string): OrderId { return x as OrderId }
function findUser(id: UserId) { /* ... */ }
const u = userId("u_123")
const o = orderId("o_456")
// findUser(o) // error: OrderId not assignable to UserIdแบรนด์สัญลักษณ์ที่ไม่ซ้ำกัน
สัญลักษณ์ที่ไม่ซ้ำกันช่วยหลีกเลี่ยงการชนกันของชื่อและการรั่วไหลเข้าสู่เนมสเปซส่วนกลาง
declare const MeterSym: unique symbol
type Meter2 = number & { readonly [MeterSym]: "meter" }
function asMeter2(n: number): Meter2 { return n as Meter2 }
const m2 = asMeter2(5)
// const wrong: Meter2 = 5 // discourage raw assignment; prefer factoriesฟังก์ชันสร้างค่าและการตรวจสอบ
ใส่แบรนด์ไว้ภายในฟังก์ชันสร้างค่า: ตรวจสอบก่อน จากนั้นติดแบรนด์ แล้วจึงนำไปใช้งาน หลีกเลี่ยงการใช้ as แบบกำหนดเฉพาะหน้า ณ จุดเรียกใช้
type NonEmptyString = string & { readonly __brand: "NonEmpty" }
function nonEmpty(s: string): NonEmptyString | null {
return s.trim().length > 0 ? (s as NonEmptyString) : null
}
function makeSlug(s: NonEmptyString) {
return (s as string).toLowerCase().replace(/\s+/g, "-")
}
const ok = nonEmpty(" Hello ")
if (ok) { makeSlug(ok) } // safe: validated & branded firstแนวทางและข้อควรระวัง
แนวทางปฏิบัติที่ดี:
- ตั้งชื่อแบรนด์ให้สั้นและสื่อความหมาย
- เปิดให้ใช้ฟังก์ชันสร้างค่าเป็นวิธีเดียวในการรับค่าที่มีแบรนด์
- อย่าเปิดเผยแบรนด์ในชนิดของ API สาธารณะ เว้นแต่จำเป็น
- แบรนด์มีผลเฉพาะในระดับชนิดเท่านั้น จึงไม่มีภาระเพิ่มขณะรันไทม์
ตรวจสอบการใช้แบรนด์
ตรวจสอบอย่างรวดเร็ว: รูปแบบใดช่วยป้องกันการสับสนระหว่างหน่วยและแท็กได้
สรุปทบทวน
สรุปทบทวน: ชนิดที่มีแบรนด์/ชนิดทึบช่วยแยกค่าที่ดูคล้ายกัน เช่น เมตรกับวินาที และ UserId กับ OrderId ได้ สร้างค่าเหล่านี้ผ่านฟังก์ชันสร้างค่า ใช้ข้าม API และกำจัดการสับสนโดยไม่ตั้งใจ
เรียนรู้ TypeScript ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 101
- บทเรียน
- 352
คำถามที่พบบ่อย
บทเรียน “ชนิดข้อมูลแบรนด์/ชนิดข้อมูลทึบเพื่อป้องกันการสับสนของหน่วย” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ชนิดข้อมูลแบรนด์/ชนิดข้อมูลทึบเพื่อป้องกันการสับสนของหน่วย” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส TypeScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 3 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ชนิดข้อมูลแบรนด์/ชนิดข้อมูลทึบเพื่อป้องกันการสับสนของหน่วย”
ป้องกันการสับสนของหน่วยหรือป้ายกำกับด้วยการผนวกชนิดข้อมูลพื้นฐานเข้ากับคุณสมบัติแบรนด์จำลอง และสร้างค่าผ่านฟังก์ชันโรงงานเท่านั้น คุณปฏิบัติ TypeScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน TypeScript Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน TypeScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน
บทเรียน “ชนิดข้อมูลแบรนด์/ชนิดข้อมูลทึบเพื่อป้องกันการสับสนของหน่วย” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน TypeScript Academy นี้ได้ไหม
ได้ บทเรียน TypeScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ชนิดข้อมูลแบรนด์/ชนิดข้อมูลทึบเพื่อป้องกันการสับสนของหน่วย
- รหัสประจำตัวแบบติดป้ายกำกับและรูปแบบการสร้างโมเดนโดเมน
- การสร้างโมเดลโดเมน — กลุ่มรวม เงื่อนไขคงที่ และบริการ