ویرگول
ورودثبت نام
mojtaba hassanzadeh
mojtaba hassanzadeh
mojtaba hassanzadeh
mojtaba hassanzadeh
خواندن ۲ دقیقه·۴ ماه پیش

تفاوت type , interface

تفاوت type و interface توی TypeScript

(با مثال‌هایی مثل پیتزا و لگو 😅)


تصور کن داری یه شهر لگویی می‌سازی:

  • interface مثل اون صفحه‌ی لگوی پایه‌ایه که می‌تونی روش تیکه‌تیکه چیزای جدید اضافه کنی.
    امروز یه خونه، فردا بالکن، پس‌فردا پنل خورشیدی. هر چی جلوتر بری، می‌تونی بازش کنی و روش چیز جدید بذاری.

  • type مثل یه قطعه‌ی لگوی پرینت سه‌بعدی اختصاصیه. خیلی دقیق و تیز. کاری رو که براش طراحی شده انجام می‌ده، اما دیگه نمی‌تونی تغییرش بدی. اگه بخوای تغییر بدی باید کلش رو از نو بسازی.


خب، فرق اصلی چیه؟

1. توسعه‌پذیری (Extensibility)

  • 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.


2. انعطاف در شکل (Flexibility in Shape)

  • type خیلی انعطاف‌پذیره. می‌تونه union، tuple، شرطی و … رو بسازه.

  • interface بیشتر برای object طراحی شده.

مثال:

type Status = 'loading' | 'success' | 'error'; // حالت‌های مختلف type Coordinates = [number, number]; // tuple type Maybe<T> = T | null | undefined; // generic

اینارو با interface نمی‌تونی بسازی.


3. ادغام (Merging) در مقابل اشتراک (Intersection)

  • 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;

4. کارایی (Performance & Tooling)

  • توی پروژه‌های بزرگ، 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 بنویسه… بعدم آروم آروم ازش فاصله بگیر 😏.

typeinterface
۰
۰
mojtaba hassanzadeh
mojtaba hassanzadeh
شاید از این پست‌ها خوشتان بیاید