CodeShot

interface در مقابل type (Type Alias)

interface عمدتاً برای توصیف شکل یک شیء یا کلاس به‌کار می‌رود و قابلیت خاصی به نام Declaration Merging دارد (چند interface هم‌نام با هم ادغام می‌شوند)، در حالی که type انعطاف بیشتری دارد و می‌تواند اتحاد (Union)، تقاطع (Intersection) یا نوع‌های اولیه و Tuple را هم تعریف کند، اما Declaration Merging ندارد.

ویژگیinterfacetype (Type Alias)
Declaration Mergingداردندارد
پشتیبانی از Union/Tupleندارددارد
مناسب برایشکل شیء/کلاسانواع پیچیده و ترکیبی

کِی از interface استفاده کنیم؟

وقتی شکل یک شیء یا قرارداد یک کلاس را تعریف می‌کنید و ممکن است بعداً بخواهید آن را Extend یا در جاهای مختلف گسترش دهید.

کِی از type (Type Alias) استفاده کنیم؟

وقتی نیاز به تعریف Union Type، Intersection یا نوع‌های پیچیده‌تر غیر از شکل ساده شیء دارید.

مثال interface

interface User {
  id: number;
  name: string;
}
interface User { // با تعریف بالا ادغام می‌شود
  email: string;
}

مثال type (Type Alias)

type Status = "pending" | "active" | "closed"; // Union
type Point = [number, number]; // Tuple
type ReadonlyUser = Readonly<User>;

اشتباه رایج

اشتباه رایج تلاش برای تعریف یک Union Type با interface است؛ interface فقط برای شکل شیء مناسب است و امکان تعریف مستقیم چیزی مثل "pending" | "active" را ندارد، این موارد باید حتماً با type نوشته شوند.

جمع‌بندی

برای شکل اشیاء و کلاس‌ها که ممکن است بعداً گسترش یابند از interface و برای Union، Intersection و نوع‌های پیچیده‌تر از type استفاده کنید.