CodeShot
Midسختی 3 از ۵· در 60٪ مصاحبه‌های این حوزه پرسیده شده

تفاوت `interface` و `type` در TypeScript چیست و کدام را باید انتخاب کرد؟

نشان کردن

پاسخ کوتاه

هر دو برای توصیف شکل یک شیء استفاده می‌شوند؛ تفاوت اصلی این است که `interface` قابل گسترش (Declaration Merging) است و `type` می‌تواند Union/Intersection و نوع‌های غیرشیءای را هم توصیف کند.

پاسخ کامل

از نظر عملکردی برای توصیف شکل یک Object این دو تقریباً یکسان‌اند:

interface UserI { id: number; name: string; }
type UserT = { id: number; name: string; };

تفاوت‌های عملی:

  • interface می‌تواند چند بار با همان نام تعریف شود و اعضا با هم ادغام می‌شوند (Declaration Merging) — مفید برای گسترش تایپ‌های کتابخانه‌های دیگر.
  • type می‌تواند Union (type Status = "ok" | "error")، Intersection، Tuple و نوع‌های ابتدایی را هم تعریف کند؛ interface فقط برای شکل شیء/کلاس مناسب است.

قاعده عملی رایج: برای توصیف شکل یک Object یا Class از interface استفاده کنید (چون معمولاً بعداً نیاز به گسترش پیدا می‌کند)، برای Union/Intersection/نوع‌های ترکیبی از type.

مثال کد

type Status = "loading" | "success" | "error"; // فقط با type ممکن است

interface Animal { name: string; }
interface Animal { age: number; } // ادغام می‌شود؛ فقط با interface ممکن است

نکته مهم

منبع کامل موضوع: TypeScript Handbook — Object Types.

اشتباه رایج

❌ گفتن اینکه «type و interface دقیقاً یکسان‌اند» — شبیه‌اند اما Declaration Merging فقط مخصوص interface است.