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

อินเทอร์เฟซและชนิดข้อมูลออบเจ็กต์

อธิบายโครงสร้างของออบเจ็กต์ด้วย interface และ type ขยายอินเทอร์เฟซ ใช้คุณสมบัติเสริมด้วย ? และใช้ readonly เพื่อป้องกันการเปลี่ยนแปลงข้อมูล

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

อินเทอร์เฟซเทียบกับชนิดข้อมูล

ทั้ง interface และ type ใช้อธิบายโครงสร้างของออบเจ็กต์ ความแตกต่างสำคัญคืออินเทอร์เฟซสามารถรวมเข้าด้วยกันได้ (การรวมคำประกาศ) และโดยทั่วไปมักเหมาะกว่าสำหรับกำหนดโครงสร้างส่วนติดต่อการเขียนโปรแกรมสาธารณะ ส่วนนามแฝงชนิดข้อมูลมีความยืดหยุ่นกว่าสำหรับชนิดข้อมูลที่ซับซ้อน

// interface:
interface User {
  id: number;
  name: string;
}

// type alias (equivalent for objects):
type User = {
  id: number;
  name: string;
};

การกำหนดอินเทอร์เฟซ

ใช้ interface เพื่อกำหนดโครงสร้างของออบเจ็กต์ พร็อพเพอร์ตีทั้งหมดจะเป็นสิ่งจำเป็นโดยค่าเริ่มต้น ให้คั่นพร็อพเพอร์ตีด้วยอัฒภาค

interface Product {
  id: number;
  name: string;
  price: number;
  description: string;
  inStock: boolean;
  category: string;
}

พร็อพเพอร์ตีที่ไม่บังคับและอ่านอย่างเดียว

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

interface Config {
  host: string;
  port?: number;          // optional: number | undefined
  readonly apiKey: string; // can't change after assignment
}

const config: Config = { host: 'localhost', apiKey: 'abc' };
config.port = 8080;       // OK
config.apiKey = 'new';    // Error: readonly

การขยายอินเทอร์เฟซ

ใช้ extends เพื่อสร้างอินเทอร์เฟซใหม่ที่มีพร็อพเพอร์ตีทั้งหมดของอินเทอร์เฟซอื่น รองรับการสืบทอดจากหลายอินเทอร์เฟซ

interface Animal {
  name: string;
  sound(): string;
}

interface Dog extends Animal {
  breed: string;
  fetch(): void;
}

interface ServiceDog extends Dog {
  task: string;
}

ลายเซ็นดัชนี — คีย์แบบไดนามิก

เมื่อคุณยังไม่ทราบชื่อพร็อพเพอร์ตีล่วงหน้า แต่ทราบชนิดของค่าพร็อพเพอร์ตี ให้ใช้ลายเซ็นดัชนี

interface StringMap {
  [key: string]: string;
}

const headers: StringMap = {
  'Content-Type': 'application/json',
  'Authorization': 'Bearer token123'
};

// Also for translating:
interface Translations {
  [locale: string]: { [key: string]: string };
}

ชนิดฟังก์ชันในอินเทอร์เฟซ

กำหนดลายเซ็นเมธอดภายในอินเทอร์เฟซได้ ทั้งไวยากรณ์แบบย่อและไวยากรณ์พร็อพเพอร์ตีแบบเต็มสามารถใช้ได้

interface Logger {
  log(message: string): void;
  warn(message: string): void;
  error(message: string, err?: Error): void;
}

// Also valid:
interface Logger2 {
  log: (message: string) => void;
}

การนำอินเทอร์เฟซไปใช้ในคลาส

คลาสหนึ่งสามารถ implement อินเทอร์เฟซได้หนึ่งรายการขึ้นไป TypeScript จะตรวจสอบว่าคลาสมีสมาชิกที่จำเป็นครบทั้งหมด

interface Serialisable {
  serialise(): string;
  deserialise(data: string): this;
}

class User implements Serialisable {
  constructor(public name: string) {}
  serialise() { return JSON.stringify({ name: this.name }); }
  deserialise(data: string) {
    const obj = JSON.parse(data);
    return new User(obj.name) as this;
  }
}

การรวมคำประกาศ

คำประกาศ interface หลายรายการที่มีชื่อเดียวกันจะถูกรวมเป็นรายการเดียว เหมาะสำหรับการขยายชนิดข้อมูลจากบุคคลที่สาม นามแฝงชนิดข้อมูลไม่รองรับความสามารถนี้

interface Window {
  myPlugin: { version: string };
}
// Now window.myPlugin is typed everywhere

ชนิดออบเจ็กต์ซ้อนกัน

พร็อพเพอร์ตีของอินเทอร์เฟซสามารถมีชนิดออบเจ็กต์ได้เอง โดยกำหนดไว้ภายในหรืออ้างอิงไปยังอินเทอร์เฟซอื่น

interface Order {
  id: string;
  customer: {
    name: string;
    email: string;
  };
  items: Array<{
    productId: string;
    quantity: number;
    price: number;
  }>;
  total: number;
}

การกำหนดชนิดตามโครงสร้าง — การกำหนดชนิดแบบเป็ด

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

interface Named {
  name: string;
}

function greet(obj: Named) {
  console.log(`Hello, ${obj.name}!`);
}

// No 'implements Named' needed:
greet({ name: 'Alice', age: 30 }); // OK — has the name property

ชนิดยูเนียนแบบจำแนกด้วยอินเทอร์เฟซ

เพิ่มพร็อพเพอร์ตีตัวจำแนกชนิดลิเทอรัลเพื่อแยกความแตกต่างระหว่างรูปแบบต่าง ๆ ในยูเนียน TypeScript จะจำกัดชนิดข้อมูลให้แคบลงใน switch หรือ if โดยอ้างอิงจากตัวจำแนก

interface Circle { kind: 'circle'; radius: number; }
interface Square { kind: 'square'; side: number; }
type Shape = Circle | Square;

function area(shape: Shape): number {
  switch (shape.kind) {
    case 'circle': return Math.PI * shape.radius ** 2;
    case 'square': return shape.side ** 2;
  }
}

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

ความแตกต่างสำคัญระหว่าง interface และ type ใน TypeScript คืออะไร

ทบทวน: อินเทอร์เฟซ

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

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

บทเรียน “อินเทอร์เฟซและชนิดข้อมูลออบเจ็กต์” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “อินเทอร์เฟซและชนิดข้อมูลออบเจ็กต์”

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

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

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

บทเรียน “อินเทอร์เฟซและชนิดข้อมูลออบเจ็กต์” ใช้เวลานานแค่ไหน

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

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

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

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

  1. เหตุผลที่ควรใช้ TypeScript: ตรวจจับบั๊กระหว่างคอมไพล์
  2. ชนิดข้อมูลพื้นฐาน ยูเนียน และชื่อแทนชนิดข้อมูล
  3. อินเทอร์เฟซและชนิดข้อมูลออบเจ็กต์
  4. การคอมไพล์ TS และ tsconfig.json
← กลับไปที่ Frontend Academy