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