0Pricing
TypeScript Academy · บทเรียน

การบวกและการลบระดับชนิดข้อมูล

สร้างการดำเนินการทางคณิตศาสตร์จากการจัดการทูเพิล

การบวกและการลบระดับชนิดข้อมูล เป็นบทเรียน TypeScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน TypeScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 4 บทเรียน

การคำนวณด้วยความยาว

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

type BuildTuple<N extends number, Acc extends unknown[] = []> =
  Acc["length"] extends N ? Acc : BuildTuple<N, [...Acc, unknown]>;

การบวก

หากต้องการบวก A + B: สร้างทูเพิลที่มีความยาว A สร้างอีกทูเพิลที่มีความยาว B กระจายองค์ประกอบของทั้งสองทูเพิลลงในทูเพิลใหม่ แล้วอ่านความยาวของทูเพิลนั้น

type Add<A extends number, B extends number> =
  [...BuildTuple<A>, ...BuildTuple<B>]["length"];

type S = Add<3, 4>; // 7

เหตุใดการต่อจึงเป็นการบวก

ทูเพิลที่มีความยาว 3 ต่อด้วยทูเพิลที่มีความยาว 4 จะได้ทูเพิลที่มีความยาว 7 เมื่อรวมขีดนับจำนวนของตัวนับสองชุดเข้าด้วยกัน ก็จะได้ตัวนับรวม ดังนั้นความยาวจึงถูกบวกกัน

type A = Add<2, 2>; // 4
type B = Add<0, 5>; // 5
type C = Add<1, 6>; // 7

การลบด้วยคำนำหน้า

หากต้องการคำนวณ A - B: สร้างทูเพิลที่มีความยาว A แล้วอนุมานให้เป็นคำนำหน้าความยาว B ตามด้วยส่วนที่เหลือ ส่วนที่เหลือใน rest มีความยาว A - B

type Sub<A extends number, B extends number> =
  BuildTuple<A> extends [...BuildTuple<B>, ...infer Rest]
    ? Rest["length"]
    : never;

type D = Sub<7, 4>; // 3

การลบแบบไล่ทีละขั้น

สำหรับ Sub<7, 4>: สร้างทูเพิลความยาว 7 จับคู่คำนำหน้าความยาว 4 เก็บ Rest ซึ่งมีความยาว 3 แล้วอ่านความยาวนั้น คำนำหน้าที่ถูกนำออกมีขีดนับจำนวนเท่ากับ B พอดี

type A = Sub<5, 2>; // 3
type B = Sub<4, 4>; // 0

ค่าต่ำกว่าขอบเขตให้ผลลัพธ์ที่ไม่มีทางเกิดขึ้น

ตัวเลขระดับชนิดในที่นี้เป็นค่าที่ไม่ติดลบ หาก B > A จะไม่มีคำนำหน้าที่ถูกต้อง รูปแบบจึงไม่ตรงกัน และผลลัพธ์คือ never หากต้องการ คุณสามารถกำหนดค่าเริ่มต้นให้เป็น 0 ได้

type A = Sub<2, 5>; // never

type SubSafe<A extends number, B extends number> =
  [Sub<A, B>] extends [never] ? 0 : Sub<A, B>;
type B = SubSafe<2, 5>; // 0

การเพิ่มค่าและการลดค่า

กรณีพิเศษของการบวกและการลบทีละหนึ่งมีใช้บ่อยจนควรตั้งชื่อไว้ Inc เพิ่มองค์ประกอบหนึ่งตัว ส่วน Dec นำออกหนึ่งตัว

type Inc<N extends number> = [...BuildTuple<N>, unknown]["length"];
type Dec<N extends number> =
  BuildTuple<N> extends [unknown, ...infer R] ? R["length"] : 0;

type A = Inc<4>; // 5
type B = Dec<4>; // 3

การคูณด้วยการทำซ้ำ

การคูณคือการบวกซ้ำ ๆ ให้บวก B เข้ากับตัวสะสมเป็นจำนวน A ครั้ง โดยนับถอยหลังด้วย Dec และสะสมผลด้วย Add

type Mul<A extends number, B extends number, Acc extends number = 0> =
  A extends 0 ? Acc : Mul<Dec<A>, B, Add<Acc, B>>;

type A = Mul<3, 4>; // 12

ตัวช่วย BuildTuple

การดำเนินการทุกอย่างในที่นี้ขึ้นอยู่กับ BuildTuple ซึ่งเป็นพื้นฐานที่นำกลับมาใช้ซ้ำได้เพียงหนึ่งเดียว: ป้อนตัวเลขให้ แล้วได้ทูเพิลที่มีความยาวเท่ากับตัวเลขนั้น เก็บไว้ในที่เดียว แล้วสร้างส่วนที่เหลือไว้ด้านบน

type Five = BuildTuple<5>; // [unknown, unknown, unknown, unknown, unknown]
type N = Five["length"];   // 5

การประกอบการดำเนินการ

เนื่องจากการดำเนินการแต่ละอย่างรับและคืนค่าเป็นตัวเลข จึงสามารถประกอบเข้าด้วยกันได้อย่างอิสระ คุณสามารถเขียนนิพจน์อย่าง Add<Mul<2, 3>, 4> แล้วคอมไพเลอร์จะประเมินผลให้

type Result = Add<Mul<2, 3>, 4>; // 10

ข้อควรระวังในการใช้งานจริง

เทคนิคเหล่านี้เหมาะอย่างยิ่งกับจำนวนเล็ก ๆ เช่น ดัชนีอาร์เรย์ ขนาดคงที่ และช่วงค่าที่มีขอบเขต สำหรับตัวเลขขนาดใหญ่หรือคณิตศาสตร์ทั่วไป ขีดจำกัดการเรียกซ้ำและการไม่มีค่าติดลบทำให้ใช้งานจริงได้ยาก ใช้เทคนิคเหล่านี้เมื่อค่าต่าง ๆ ยังคงเล็กและคงที่

type A = Add<8, 7>;  // 15 (fine)
// Add<5000, 5000> would exceed recursion limits

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับคณิตศาสตร์ระดับชนิด

ทบทวน

คุณได้สร้างการคำนวณทางคณิตศาสตร์ในระบบชนิด

  • การบวก: ต่อทูเพิลแล้วอ่านความยาว
  • การลบ: อนุมานคำนำหน้าแล้วอ่านความยาวของส่วนที่เหลือ
  • Inc/Dec คือรูปแบบที่ทำทีละขั้น
  • BuildTuple คือพื้นฐานที่ใช้ร่วมกัน

ถัดไป: การเปรียบเทียบตัวเลขในระดับชนิด

คำถามที่พบบ่อย

บทเรียน “การบวกและการลบระดับชนิดข้อมูล” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การบวกและการลบระดับชนิดข้อมูล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส TypeScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การบวกและการลบระดับชนิดข้อมูล”

สร้างการดำเนินการทางคณิตศาสตร์จากการจัดการทูเพิล คุณปฏิบัติ TypeScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน TypeScript Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน TypeScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การบวกและการลบระดับชนิดข้อมูล” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน TypeScript Academy นี้ได้ไหม

ได้ บทเรียน TypeScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. การนับด้วยความยาวทูเพิล
  2. การบวกและการลบระดับชนิดข้อมูล
  3. การเปรียบเทียบระดับชนิดข้อมูล
  4. ยูทิลิตีชนิดข้อมูลตัวเลขในทางปฏิบัติ
← กลับไปที่ TypeScript Academy