TypeScript Academy · บทเรียน

ชนิดข้อมูลแบรนด์/ชนิดข้อมูลทึบเพื่อป้องกันการสับสนของหน่วย

ป้องกันการสับสนของหน่วยหรือป้ายกำกับด้วยการผนวกชนิดข้อมูลพื้นฐานเข้ากับคุณสมบัติแบรนด์จำลอง และสร้างค่าผ่านฟังก์ชันโรงงานเท่านั้น

บทเรียน 1 จาก 38 ขั้นตอน

ชนิดข้อมูลแบรนด์/ชนิดข้อมูลทึบเพื่อป้องกันการสับสนของหน่วย เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ชนิดข้อมูลแบรนด์/ชนิดข้อมูลทึบเพื่อป้องกันการสับสนของหน่วย
  2. รหัสประจำตัวแบบติดป้ายกำกับและรูปแบบการสร้างโมเดนโดเมน
  3. การสร้างโมเดลโดเมน — กลุ่มรวม เงื่อนไขคงที่ และบริการ
← กลับไปที่ TypeScript Academy