อินเทอร์เฟซและชนิดข้อมูลออบเจ็กต์
อธิบายโครงสร้างของออบเจ็กต์ด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุผลที่ควรใช้ TypeScript: ตรวจจับบั๊กระหว่างคอมไพล์
- ชนิดข้อมูลพื้นฐาน ยูเนียน และชื่อแทนชนิดข้อมูล
- อินเทอร์เฟซและชนิดข้อมูลออบเจ็กต์
- การคอมไพล์ TS และ tsconfig.json