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

การระบุชนิดตามบริบท: การอนุมานจากบริบท

ทำความเข้าใจว่า 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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