การทำให้ชนิดข้อมูลแคบลง: typeof, instanceof และยูเนียนแบบจำแนก
ใช้ตัวตรวจสอบชนิดข้อมูลเพื่อทำให้ชนิดยูเนียนแคบลงขณะรันไทม์ด้วย typeof, instanceof และรูปแบบยูเนียนแบบจำแนก
การทำให้ชนิดข้อมูลแคบลง: typeof, instanceof และยูเนียนแบบจำแนก เป็นบทเรียน Frontend Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Frontend Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Frontend Academy มีบทเรียนทั้งหมด 4 บทเรียน
การทำให้ชนิดข้อมูลแคบลงคืออะไร
TypeScript เริ่มต้นด้วยชนิดข้อมูลแบบกว้าง เช่น string | number การทำให้ชนิดข้อมูลแคบลงคือกระบวนการปรับชนิดข้อมูลให้เฉพาะเจาะจงมากขึ้นภายในบล็อกเงื่อนไข TypeScript จะติดตามการทำให้ชนิดข้อมูลแคบลงโดยอัตโนมัติ
การทำให้ชนิดข้อมูลแคบลงด้วย typeof
ตัวดำเนินการ typeof ใช้ทำให้ชนิดข้อมูลพื้นฐานแคบลง ภายในบล็อก if TypeScript จะทราบชนิดข้อมูลที่แน่นอนได้
function format(value: string | number | boolean): string {
if (typeof value === 'string') {
return value.toUpperCase(); // string here
}
if (typeof value === 'number') {
return value.toFixed(2); // number here
}
return String(value); // boolean here
}การทำให้ชนิดข้อมูลแคบลงด้วย instanceof
instanceof ใช้ทำให้ชนิดข้อมูลของอินสแตนซ์จากคลาสแคบลง TypeScript จะทราบคลาสที่เฉพาะเจาะจงภายในบล็อกนั้น
function processError(err: unknown) {
if (err instanceof Error) {
console.error(err.message); // Error methods available
} else if (err instanceof Response) {
console.error('HTTP error:', err.status);
} else {
console.error('Unknown:', err);
}
}การทำให้ชนิดข้อมูลแคบลงด้วยค่าความจริง
TypeScript จะตัด null และ undefined ออกเมื่อใช้การตรวจสอบค่าความจริง
function printLength(value: string | null | undefined) {
if (value) {
console.log(value.length); // string here (null/undefined filtered)
}
}การทำให้ชนิดข้อมูลแคบลงด้วยการเปรียบเทียบความเท่ากัน
การเปรียบเทียบความเท่ากันแบบเคร่งครัดจะทำให้เหลือชนิดข้อมูลลิเทอรัล ซึ่งมีประโยชน์สำหรับยูเนียนแบบแยกแยะและอีนัมของสตริง
function handle(action: 'submit' | 'cancel' | 'reset') {
if (action === 'submit') {
// action is exactly 'submit'
doSubmit();
}
}การทำให้ชนิดข้อมูลแคบลงด้วยตัวดำเนินการ in
ตัวดำเนินการ in ใช้ทำให้ชนิดข้อมูลยูเนียนของอ็อบเจ็กต์แคบลง โดยตรวจสอบว่าคุณสมบัติใดมีอยู่
interface Cat { meow(): void; }
interface Dog { bark(): void; }
function speak(animal: Cat | Dog) {
if ('meow' in animal) {
animal.meow(); // Cat
} else {
animal.bark(); // Dog
}
}ยูเนียนแบบแยกแยะ — การทำให้ชนิดข้อมูลแคบลงตามแท็ก
ยูเนียนแบบแยกแยะมีคุณสมบัติชนิดข้อมูลลิเทอรัลร่วมกัน ซึ่งเรียกว่า ตัวแยกแยะ TypeScript จะทำให้ยูเนียนแคบลงใน switch หรือ if โดยอิงจากคุณสมบัตินั้น
type LoadingState = { status: 'loading' };
type SuccessState = { status: 'success'; data: User[] };
type ErrorState = { status: 'error'; message: string };
type State = LoadingState | SuccessState | ErrorState;
function render(state: State) {
switch (state.status) {
case 'loading': return '<Spinner />';
case 'success': return renderUsers(state.data); // state.data available
case 'error': return renderError(state.message);
}
}เพรดิเคตชนิดข้อมูล — ตัวตรวจสอบชนิดข้อมูลแบบกำหนดเอง
ฟังก์ชันเพรดิเคตชนิดข้อมูลจะทำให้ชนิดข้อมูลแคบลงสำหรับผู้เรียก ใช้ param is Type เป็นชนิดข้อมูลผลลัพธ์
function isUser(value: unknown): value is User {
return (
typeof value === 'object' &&
value !== null &&
'name' in value &&
typeof (value as User).name === 'string'
);
}
const data: unknown = await fetchJson('/api/me');
if (isUser(data)) {
console.log(data.name); // typed as User
}ฟังก์ชันยืนยัน
ฟังก์ชันยืนยันจะโยนข้อผิดพลาดหากเงื่อนไขไม่ผ่าน และจะทำให้ชนิดข้อมูลแคบลงหลังจากเรียกใช้ฟังก์ชัน
function assertIsString(val: unknown): asserts val is string {
if (typeof val !== 'string') throw new Error('Expected string');
}
const val: unknown = getInput();
assertIsString(val);
console.log(val.toUpperCase()); // val is string hereการตรวจสอบความครบถ้วนทุกกรณี
เมื่อ switch ที่ทำงานกับยูเนียนแบบแยกแยะเหลือชนิดข้อมูล never ในแขนง default TypeScript จะตรวจสอบว่าจัดการครบทุกกรณีแล้ว ให้เพิ่ม default ที่กำหนดค่าเป็น never เพื่อให้เกิดข้อผิดพลาดขณะคอมไพล์หากมีการเพิ่มรูปแบบใหม่
function render(state: State): string {
switch (state.status) {
case 'loading': return '...';
case 'success': return state.data.length.toString();
case 'error': return state.message;
default:
const _exhaustive: never = state;
throw new Error('Unhandled state: ' + _exhaustive);
}
}การทำให้ชนิดข้อมูลแคบลงด้วย Array.isArray
Array.isArray() จะทำให้ค่ามีชนิดข้อมูลเป็นอาร์เรย์
function processInput(input: string | string[]) {
if (Array.isArray(input)) {
return input.join(', '); // string[]
}
return input.toUpperCase(); // string
}ตรวจสอบอย่างรวดเร็ว
เทคนิคใดใช้คุณสมบัติลิเทอรัลร่วมกันเพื่อแยกรูปแบบต่าง ๆ ของชนิดข้อมูลยูเนียน
สรุป: การทำให้ชนิดข้อมูลแคบลงใน TypeScript
ใช้ typeof กับชนิดข้อมูลพื้นฐาน ใช้ instanceof กับคลาส ใช้ตัวดำเนินการ in กับโครงสร้างของอ็อบเจ็กต์ การตรวจสอบค่าความจริงใช้กรอง null และ undefined ยูเนียนแบบแยกแยะที่มีคุณสมบัติลิเทอรัลร่วมกันช่วยให้เขียนคำสั่ง switch ที่จัดการครบทุกกรณีได้ ใช้เพรดิเคตชนิดข้อมูลแบบกำหนดเอง (is) สำหรับการตรวจสอบขณะทำงานที่ซับซ้อน และใช้ never ในค่า default เพื่อตรวจสอบความครบถ้วนทุกกรณี
คำถามที่พบบ่อย
บทเรียน “การทำให้ชนิดข้อมูลแคบลง: typeof, instanceof และยูเนียนแบบจำแนก” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การทำให้ชนิดข้อมูลแคบลง: typeof, instanceof และยูเนียนแบบจำแนก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Frontend Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Frontend Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การทำให้ชนิดข้อมูลแคบลง: typeof, instanceof และยูเนียนแบบจำแนก”
ใช้ตัวตรวจสอบชนิดข้อมูลเพื่อทำให้ชนิดยูเนียนแคบลงขณะรันไทม์ด้วย typeof, instanceof และรูปแบบยูเนียนแบบจำแนก คุณปฏิบัติ Frontend Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Frontend Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Frontend Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การทำให้ชนิดข้อมูลแคบลง: typeof, instanceof และยูเนียนแบบจำแนก” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Frontend Academy นี้ได้ไหม
ได้ บทเรียน Frontend Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Generics: T, extends และข้อจำกัด
- ชนิดข้อมูลอรรถประโยชน์: Partial, Required, Pick และ Omit
- ชนิดข้อมูลแบบแมปและชนิดข้อมูลแบบมีเงื่อนไข
- การทำให้ชนิดข้อมูลแคบลง: typeof, instanceof และยูเนียนแบบจำแนก