TypeScript interfaces and types


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

Interfaces

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

ตัวอย่างการประกาศ Interface สำหรับออบเจ็กต์ Person:

interface Person {
  name: string;
  age: number;
  email?: string;
}

ในตัวอย่างนี้ Interface Person กำหนดว่าออบเจ็กต์ Person ควรมี property name เป็น string, age เป็น number และ email เป็น string และเป็น optional (กำหนดด้วยเครื่องหมาย ?)

เมื่อประกาศตัวแปรหรือฟังก์ชันที่ใช้ออบเจ็กต์ Person TypeScript จะตรวจสอบให้แน่ใจว่าออบเจ็กต์นั้นมีโครงสร้างตรงตามที่กำหนดไว้ใน Interface

function greetPerson(person: Person) {
  console.log(`Hello, ${person.name}!`);
}

const john = { name: 'John', age: 30 };
greetPerson(john); // output: Hello, John!

Types

Type aliases ใน TypeScript ใช้สำหรับการกำหนดชื่อให้กับชนิดข้อมูลที่ซับซ้อนหรือชนิดข้อมูลที่ใช้บ่อยๆ เพื่อให้โค้ดอ่านง่ายและเข้าใจได้มากขึ้น Type aliases สามารถใช้แทนชนิดข้อมูลใดๆ ก็ได้ เช่น primitive types, union types, intersection types หรือแม้แต่ออบเจ็กต์

ตัวอย่างการประกาศ Type alias สำหรับชนิดข้อมูลที่ซับซ้อน:

type Point = {
  x: number;
  y: number;
};

function calculateDistance(p1: Point, p2: Point): number {
  // ...
}

ในตัวอย่างนี้ เราประกาศ Type alias ชื่อ Point ซึ่งแทนออบเจ็กต์ที่มี property x และ y เป็น number เราสามารถใช้ Point เป็นชนิดข้อมูลสำหรับพารามิเตอร์ p1 และ p2 ในฟังก์ชัน calculateDistance ได้

Type aliases ยังสามารถใช้ในการสร้าง union types และ intersection types ได้อีกด้วย

type Status = 'active' | 'inactive';
type UserRoles = 'admin' & 'user';

เมื่อใดควรใช้ Interface และเมื่อใดควรใช้ Type?

  • ใช้ Interface เมื่อต้องการกำหนดโครงสร้างของออบเจ็กต์ โดยเฉพาะอย่างยิ่งเมื่อต้องการใช้ features เฉพาะของ Interface เช่น declaration merging หรือ extension

  • ใช้ Type เมื่อต้องการกำหนดชื่อให้กับชนิดข้อมูลที่ซับซ้อน, union types, หรือ intersection types หรือเมื่อต้องการกำหนดชื่อให้กับชนิดข้อมูลใดๆ ที่ไม่ใช่ออบเจ็กต์

  • หากไม่มีความจำเป็นที่ต้องใช้ features เฉพาะของ Interface หรือ Type การเลือกใช้ Interface หรือ Type ก็ขึ้นอยู่กับความชอบส่วนบุคคลหรือ coding convention ของทีม

โดยสรุป ทั้ง Interfaces และ Types ช่วยให้เราสามารถกำหนดและบังคับใช้โครงสร้างของข้อมูลใน TypeScript ได้อย่างมีประสิทธิภาพ ซึ่งนำไปสู่โค้ดที่อ่านง่าย เข้าใจได้ และลดข้อผิดพลาดที่อาจเกิดขึ้น การเลือกใช้ Interface หรือ Type ขึ้นอยู่กับความต้องการและความซับซ้อนของโครงสร้างข้อมูลในแต่ละกรณี

Last updated