การระบุชนิดตามบริบท: การอนุมานจากบริบท
ทำความเข้าใจว่า TypeScript อนุมานชนิดจากบริบทโดยรอบอย่างไร
การระบุชนิดตามบริบท: การอนุมานจากบริบท เป็นบทเรียน TypeScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน TypeScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
การกำหนดชนิดข้อมูลตามบริบทคืออะไร
การกำหนดชนิดข้อมูลตามบริบทเกิดขึ้นเมื่อ TypeScript อนุมานชนิดข้อมูลของนิพจน์ตามตำแหน่งที่นิพจน์นั้นปรากฏ — บริบทเป็นตัวกำหนดชนิดข้อมูล ไม่ใช่ค่าของนิพจน์เอง
document.addEventListener("click", (e) => {
// e is inferred as MouseEvent from the event type
console.log(e.clientX);
});การกำหนดชนิดข้อมูลตามบริบทในฟังก์ชันเรียกกลับ
เมื่อคุณส่งฟังก์ชันเรียกกลับให้กับฟังก์ชันที่มีชนิดข้อมูล TypeScript จะอนุมานชนิดข้อมูลของพารามิเตอร์จากลายเซ็นของฟังก์ชันเรียกกลับที่คาดไว้
const nums = [1, 2, 3];
nums.forEach((n) => {
// n inferred as number from Array<number>
console.log(n.toFixed(2));
});การกำหนดชนิดข้อมูลตามบริบทและค่าลิเทอรัลของออบเจ็กต์
เมื่อกำหนดค่าลิเทอรัลของออบเจ็กต์ให้กับตัวแปรที่มีชนิดข้อมูล ชนิดข้อมูลของพร็อพเพอร์ตีจะถูกอนุมานจากชนิดข้อมูลนั้น ทำให้ตรวจสอบได้อย่างแม่นยำ
interface Config { timeout: number; retries: number; }
const config: Config = {
timeout: 3000,
retries: 3,
// extra: true // Error: excess property
};การกำหนดชนิดข้อมูลตามบริบทใน JSX
ใน React พร็อพ handler ของเหตุการณ์จะมีชนิดข้อมูลตามบริบท ทำให้อนุมานชนิดข้อมูลของพารามิเตอร์เหตุการณ์ได้โดยอัตโนมัติ
function Button({ onClick }: { onClick: (e: React.MouseEvent) => void }) {
return <button onClick={onClick}>Click</button>;
}
// Caller: e is inferred as React.MouseEvent
<Button onClick={(e) => console.log(e.currentTarget)} />การกำหนดชนิดข้อมูลตามบริบทเทียบกับคำอธิบายชนิดข้อมูลอย่างชัดเจน
การกำหนดชนิดข้อมูลตามบริบทมีประสิทธิภาพ แต่สามารถถูกแทนที่ด้วยคำอธิบายชนิดข้อมูลอย่างชัดเจนได้ เมื่อมีทั้งสองอย่าง การระบุอย่างชัดเจนจะมีผลเหนือบริบท
const handler: (x: string) => void = (x: number) => {}; // Error
// Explicit annotation (number) conflicts with contextual (string)การกำหนดชนิดข้อมูลตามบริบทด้วยการแยกโครงสร้าง
พารามิเตอร์ที่แยกโครงสร้างในฟังก์ชันซึ่งมีชนิดข้อมูลตามบริบทก็สืบทอดชนิดข้อมูลจากบริบทเช่นกัน
const pairs: [string, number][] = [["a", 1]];
pairs.forEach(([key, value]) => {
// key: string, value: number — contextually typed
console.log(key.toUpperCase(), value * 2);
});การกำหนดชนิดข้อมูลตามบริบทและชนิดข้อมูลของค่าที่ส่งคืน
เมื่อกำหนดฟังก์ชันให้กับตัวแปรที่มีชนิดข้อมูล ชนิดข้อมูลของค่าที่ส่งคืนก็จะถูกอนุมานตามบริบทเช่นกัน
type Transform = (x: number) => string;
const double: Transform = (x) => x * 2; // Error: number not string
const str: Transform = (x) => String(x * 2); // OKการกำหนดชนิดข้อมูลตามบริบทในนิพจน์แบบมีเงื่อนไข
TypeScript สามารถส่งต่อชนิดข้อมูลตามบริบทเข้าไปในนิพจน์สามทางและตัวดำเนินการตรรกะได้
const result: string | null =
Math.random() > 0.5 ? "yes" : null; // both arms typed by contextข้อจำกัดของการกำหนดชนิดข้อมูลตามบริบท
การกำหนดชนิดข้อมูลตามบริบทจะไม่ใช้เมื่อนิพจน์อยู่ในตำแหน่งที่ไม่มีบริบท เช่น ตัวแปรเดี่ยวที่ไม่มีคำอธิบายชนิดข้อมูล
const fn = (x) => x + 1; // x: any — no context to infer from
// Add annotation: const fn = (x: number) => x + 1;การอนุมานชนิดข้อมูลสองทิศทาง
TypeScript ทำการอนุมานชนิดข้อมูลสองทิศทาง ได้แก่ จากบนลงล่างตามบริบท และจากล่างขึ้นบนจากนิพจน์ ทั้งสองแนวทางทำงานร่วมกันเพื่อให้ได้ชนิดข้อมูลที่แม่นยำที่สุด
function apply<T>(fn: (x: T) => T, val: T): T { return fn(val); }
apply((x) => x.toUpperCase(), "hello"); // x inferred as stringสรุป: การกำหนดชนิดข้อมูลตามบริบท
การกำหนดชนิดข้อมูลตามบริบทช่วยให้ TypeScript อนุมานชนิดข้อมูลจากตำแหน่งที่ใช้นิพจน์ — ฟังก์ชันเรียกกลับ การกำหนดค่า พร็อพ JSX และการแยกโครงสร้างล้วนได้รับประโยชน์จากกลไกการอนุมานนี้
ตรวจสอบอย่างรวดเร็ว
การกำหนดชนิดข้อมูลตามบริบทใช้กับพารามิเตอร์ของฟังก์ชันเรียกกลับเมื่อใด
สิ่งที่คุณได้เรียนรู้
การกำหนดชนิดข้อมูลตามบริบทคือการที่ TypeScript อนุมานชนิดข้อมูลจากตำแหน่ง ไม่ใช่จากค่า ทำให้ฟังก์ชันเรียกกลับ ตัวจัดการเหตุการณ์ และการกำหนดค่าที่มีชนิดข้อมูลกระชับแต่ยังคงปลอดภัยด้านชนิดข้อมูล
คำถามที่พบบ่อย
บทเรียน “การระบุชนิดตามบริบท: การอนุมานจากบริบท” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การระบุชนิดตามบริบท: การอนุมานจากบริบท” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส TypeScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การระบุชนิดตามบริบท: การอนุมานจากบริบท”
ทำความเข้าใจว่า TypeScript อนุมานชนิดจากบริบทโดยรอบอย่างไร คุณปฏิบัติ TypeScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน TypeScript Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน TypeScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การระบุชนิดตามบริบท: การอนุมานจากบริบท” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน TypeScript Academy นี้ได้ไหม
ได้ บทเรียน TypeScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- กลไกการขยายและจำกัดชนิดให้แคบลง
- การระบุชนิดตามบริบท: การอนุมานจากบริบท
- ความใหม่และการตรวจสอบพร็อพเพอร์ตีส่วนเกิน
- การยืนยัน const และ as const