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

การยืนยันเทียบกับตัวตรวจสอบชนิดข้อมูล

เลือกใช้การตรวจสอบขณะทำงานแทนการยืนยันเมื่อทำได้

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

สองวิธีในการทำให้คอมไพเลอร์เชื่อ

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

function viaAssert(v: unknown): number {
  return (v as number) + 1; // claim
}
function viaGuard(v: unknown): number {
  return typeof v === 'number' ? v + 1 : 0; // prove
}
console.log(viaAssert(5), viaGuard(5), viaGuard('x'));

การยืนยันไม่ได้ตรวจสอบ

การยืนยันคือคำรับรองที่ไม่มีการบังคับใช้ หากคุณเข้าใจผิด ข้อบกพร่องจะหลุดไปเกิดขึ้นขณะทำงาน การยืนยันแลกความปลอดภัยกับความสะดวก

const v: unknown = 'hello';
const n = v as number;
console.log(n.toFixed(2)); // runtime error: toFixed is not a function

ตัวตรวจสอบชนิดตรวจสอบขณะทำงาน

ตัวตรวจสอบชนิดจะตรวจสอบค่าจริง ๆ หากการตรวจสอบผ่าน ทั้งคุณและคอมไพเลอร์ก็ทราบว่าชนิดข้อมูลถูกต้อง เพราะมีการทดสอบขณะทำงานจริงรองรับการจำกัดชนิด

function toFixed2(v: unknown): string {
  if (typeof v === 'number') return v.toFixed(2);
  return 'N/A';
}
console.log(toFixed2(3.14159), toFixed2('hi'));

ฟังก์ชันตัวตรวจสอบชนิดแบบกำหนดเอง

รวมการตรวจสอบที่ซับซ้อนไว้ในตัวตรวจสอบที่นำกลับมาใช้ใหม่ได้ ซึ่งคืนค่า value is T ทั้งโค้ดจะได้ประโยชน์จากการตรวจสอบความถูกต้องเพียงชุดเดียวที่ผ่านการทดสอบมาอย่างดี

type Email = { address: string };
function isEmail(v: unknown): v is Email {
  return typeof v === 'object' && v !== null &&
    'address' in v && typeof (v as any).address === 'string';
}
console.log(isEmail({ address: 'a@b.com' }), isEmail(null));

ตัวตรวจสอบชนิดนำมาประกอบและใช้ซ้ำได้

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

function isString(v: unknown): v is string { return typeof v === 'string'; }
function isNonEmpty(v: unknown): v is string {
  return isString(v) && v.length > 0;
}
console.log(isNonEmpty('hi'), isNonEmpty(''));

ฟังก์ชันยืนยันด้วยคำสำคัญสำหรับยืนยัน

TypeScript ยังมีฟังก์ชันยืนยันให้ใช้ด้วย ส่วนคำอธิบายค่าที่ส่งคืนจะใช้คำสำคัญ asserts หากฟังก์ชันคืนค่าตามปกติ คอมไพเลอร์จะจำกัดชนิดของอาร์กิวเมนต์ตั้งแต่จุดนั้นเป็นต้นไป แต่หากเงื่อนไขไม่ผ่าน ฟังก์ชันจะโยนข้อผิดพลาด

function assertNumber(v: unknown): asserts v is number {
  if (typeof v !== 'number') throw new Error('not a number');
}
function use(v: unknown): number {
  assertNumber(v); // after this line, v is number
  return v * 2;
}
console.log(use(21));

การยืนยันแบบโยนข้อผิดพลาดกับการยืนยันแบบคืนค่าชนิด

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

function assertDefined<T>(v: T): asserts v is NonNullable<T> {
  if (v === null || v === undefined) throw new Error('missing');
}
const maybe: string | null = 'ok';
assertDefined(maybe);
console.log(maybe.length); // narrowed to string

ตัวช่วยการยืนยันทั่วไป

ฟังก์ชันยืนยันเหมาะอย่างยิ่งสำหรับเงื่อนไขเบื้องต้นที่นำกลับมาใช้ใหม่ได้ ตัวช่วย assert(condition) เพียงตัวเดียวสามารถตรวจสอบเงื่อนไขคงที่ทั่วทั้งโค้ดของคุณ และโยนข้อผิดพลาดทันทีเมื่อพบการละเมิด

function assert(cond: unknown, msg: string): asserts cond {
  if (!cond) throw new Error(msg);
}
function half(n: number): number {
  assert(n % 2 === 0, 'must be even');
  return n / 2;
}
console.log(half(8));

เปรียบเทียบความปลอดภัย

เรียงจากปลอดภัยที่สุดไปเสี่ยงที่สุด: ตัวตรวจสอบชนิดและฟังก์ชันยืนยัน (ตรวจสอบขณะทำงาน) อยู่เหนือการยืนยันด้วย as แบบทั่วไป (ไม่ตรวจสอบ) ซึ่งอยู่เหนือการยืนยันซ้อน (ทำให้เข้าใจผิดโดยตรง) ให้เลือกเครื่องมือที่ปลอดภัยที่สุดและเหมาะกับงาน

// Safe: guard
function safe(v: unknown) {
  return typeof v === 'string' ? v.trim() : '';
}
console.log(safe('  hi  '));

เลือกเครื่องมือให้เหมาะสม

ใช้ตัวตรวจสอบชนิดเมื่อคุณแยกแขนงตามชนิดข้อมูล ใช้ฟังก์ชันยืนยันเมื่อเงื่อนไขเบื้องต้นต้องเป็นจริงหรือควรหยุดการทำงาน ใช้ as เฉพาะเมื่อไม่สามารถจำกัดชนิดด้วยวิธีอื่นได้ (เช่น การทำให้ชนิดเฉพาะเจาะจงใน DOM)

function getInput(v: unknown): asserts v is string {
  if (typeof v !== 'string') throw new Error('expected string');
}
const raw: unknown = 'name';
getInput(raw);
console.log(raw.toUpperCase());

การตรวจสอบขณะทำงานคือทางเลือกที่เหนือกว่า

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

function parsePort(v: unknown): number {
  if (typeof v === 'number' && Number.isInteger(v)) return v;
  throw new Error('invalid port');
}
console.log(parsePort(8080));

ตรวจสอบอย่างรวดเร็ว

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

ทบทวน: การยืนยันกับตัวตรวจสอบชนิด

คุณได้เรียนรู้ว่า:

  • ตัวตรวจสอบชนิด (value is T) พิสูจน์ชนิดข้อมูลขณะทำงานและช่วยให้คุณแยกแขนงได้
  • ฟังก์ชันยืนยัน (asserts value is T) จะโยนข้อผิดพลาดเมื่อไม่ผ่านและจำกัดชนิดหลังจากนั้น
  • การยืนยันด้วย as แบบทั่วไปเพียงอ้างว่าค่าเป็นชนิดหนึ่งเท่านั้น ไม่มีความปลอดภัยขณะทำงาน
  • ควรเลือกใช้เครื่องมือที่ตรวจสอบขณะทำงาน และสงวนการยืนยันไว้สำหรับกรณีที่ไม่สามารถจำกัดชนิดด้วยวิธีอื่นได้

หลักสูตรถัดไป: การเชื่อมต่อแบบเลือกได้และการรวมค่าค่าว่าง

function isPositive(v: unknown): v is number {
  return typeof v === 'number' && v > 0;
}
console.log(isPositive(5), isPositive(-1));

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

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

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

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

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

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

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

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

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

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

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

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

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