type و interface توی TypeScript(با مثالهایی مثل پیتزا و لگو 😅)
interface مثل اون صفحهی لگوی پایهایه که میتونی روش تیکهتیکه چیزای جدید اضافه کنی.
امروز یه خونه، فردا بالکن، پسفردا پنل خورشیدی. هر چی جلوتر بری، میتونی بازش کنی و روش چیز جدید بذاری.
type مثل یه قطعهی لگوی پرینت سهبعدی اختصاصیه. خیلی دقیق و تیز. کاری رو که براش طراحی شده انجام میده، اما دیگه نمیتونی تغییرش بدی. اگه بخوای تغییر بدی باید کلش رو از نو بسازی.
interface میتونه دوباره باز بشه و چیزای جدید بهش اضافه بشه:
interface Cat { meow: () => string; } // یه جای دیگه interface Cat { purr: () => string; } // الان Cat هم meow داره هم purr
ولی type اینو قبول نمیکنه. اگه دوباره تعریفش کنی خطا میگیری:
type Dog = { bark: () => string; }; type Dog = { wagTail: () => void; }; // ❌ Error: Cannot redeclare ‘Dog’
📌 نتیجه: اگه میخوای چیزی توی پروژه یا لایبرریت رشد کنه و بعداً قابل گسترش باشه → interface.
type خیلی انعطافپذیره. میتونه union، tuple، شرطی و … رو بسازه.
interface بیشتر برای object طراحی شده.
مثال:
type Status = 'loading' | 'success' | 'error'; // حالتهای مختلف type Coordinates = [number, number]; // tuple type Maybe<T> = T | null | undefined; // generic
اینارو با interface نمیتونی بسازی.
interface خودش خودکار merge میشه:
interface User { id: number; } interface User { name: string; } // User = { id: number; name: string }
ولی type نیاز به & داره (intersection):
type Id = { id: number }; type Name = { name: string }; type User = Id & Name;
توی پروژههای بزرگ، interface سریعتره (autocomplete بهتر، کمتر هنگ کردن VSCode).
type مخصوصاً وقتی union یا شرطی زیاد داری میتونه IDE رو سنگین کنه.
قاعدهی کلی:
✅ interface:
شکل آبجکتها (کاربر، کانفیگ، ریسپانس API)
وقتی میخوای کلاس یه قرارداد رو implement کنه
توی لایبرریها یا کدی که قراره بقیه extend کنن
✅ type:
union ('dark' | 'light')
tuple ([string, number])
فانکشنها و overloadها
mapped types یا conditional types
میتونی یه interface رو از یه type که شکل آبجکت داره extend کنی:
type Animal = { sound: string }; interface Dog extends Animal { breed: string; } // ✅ کار میکنه
ولی اگه type شامل union یا primitive باشه، interface نمیتونه ازش extend بشه.
interface مثل یه کتوشلوار دوختهشدهست → شیک، تمیز، آمادهی گسترش.
type مثل چاقوی سوئیسیه → همهکاره، انعطافپذیر، مخصوص وقتی اوضاع عجیب میشه.
هر دوش لازمن. نباید مذهبی فقط یکی رو انتخاب کنی.
اگه همکارت گفت «type همیشه بهتره» ازش بخواه یه union با interface بنویسه… بعدم آروم آروم ازش فاصله بگیر 😏.