فارسی

راهنمای جامع اینترفیس‌ها و تایپ‌ها در TypeScript، بررسی تفاوت‌ها، موارد استفاده و بهترین شیوه‌ها برای ساخت اپلیکیشن‌های قابل نگهداری و مقیاس‌پذیر در سراسر جهان.

اینترفیس (Interface) در مقابل تایپ (Type) در TypeScript: بهترین شیوه‌های تعریف برای توسعه‌دهندگان جهانی

تایپ‌اسکریپت (TypeScript)، که یک ابرمجموعه از جاوااسکریپت است، توسعه‌دهندگان را در سراسر جهان قادر می‌سازد تا از طریق تایپ ایستا (static typing)، اپلیکیشن‌های قوی و مقیاس‌پذیر بسازند. دو ساختار اساسی برای تعریف انواع، اینترفیس‌ها (Interfaces) و تایپ‌ها (Types) هستند. اگرچه شباهت‌هایی دارند، اما درک تفاوت‌های ظریف و موارد استفاده مناسب آن‌ها برای نوشتن کدی تمیز، قابل نگهداری و کارآمد حیاتی است. این راهنمای جامع به بررسی تفاوت‌های بین اینترفیس‌ها و تایپ‌ها در TypeScript می‌پردازد و بهترین شیوه‌ها برای استفاده مؤثر از آن‌ها در پروژه‌هایتان را بررسی می‌کند.

درک اینترفیس‌ها در TypeScript

یک اینترفیس (Interface) در TypeScript روشی قدرتمند برای تعریف یک قرارداد برای یک شیء است. اینترفیس شکل یک شیء را مشخص می‌کند و ویژگی‌هایی که باید داشته باشد، انواع داده‌ای آن‌ها و به صورت اختیاری، متدهایی که باید پیاده‌سازی کند را تعیین می‌کند. اینترفیس‌ها عمدتاً ساختار اشیاء را توصیف می‌کنند.

سینتکس و مثال اینترفیس

سینتکس تعریف یک اینترفیس ساده است:


interface User {
  id: number;
  name: string;
  email: string;
  isActive: boolean;
}

const user: User = {
  id: 123,
  name: "Alice Smith",
  email: "alice.smith@example.com",
  isActive: true,
};

در این مثال، اینترفیس User ساختار یک شیء کاربر را تعریف می‌کند. هر شیئی که به متغیر user اختصاص داده شود باید از این ساختار پیروی کند؛ در غیر این صورت، کامپایلر TypeScript خطا ایجاد می‌کند.

ویژگی‌های کلیدی اینترفیس‌ها

مثال ادغام تعاریف


interface Window {
  title: string;
}

interface Window {
  height: number;
  width: number;
}

const myWindow: Window = {
  title: "My Application",
  height: 800,
  width: 600,
};

در اینجا، اینترفیس Window دو بار تعریف شده است. تایپ‌اسکریپت این تعاریف را ادغام می‌کند و عملاً یک اینترفیس با ویژگی‌های title، height و width ایجاد می‌کند.

بررسی تایپ‌ها در TypeScript

یک تایپ (Type) در TypeScript راهی برای تعریف شکل داده‌ها فراهم می‌کند. برخلاف اینترفیس‌ها، تایپ‌ها تطبیق‌پذیرتر هستند و می‌توانند طیف گسترده‌تری از ساختارهای داده، از جمله انواع اولیه، اجتماع‌ها (unions)، اشتراک‌ها (intersections) و تاپل‌ها (tuples) را نمایندگی کنند.

سینتکس و مثال تایپ

سینتکس تعریف یک نام مستعار برای تایپ (type alias) به شرح زیر است:


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

const origin: Point = {
  x: 0,
  y: 0,
};

در این مثال، تایپ Point ساختار یک شیء نقطه با مختصات x و y را تعریف می‌کند.

ویژگی‌های کلیدی تایپ‌ها

مثال تایپ اجتماع


type Result = {
  success: true;
  data: any;
} | {
  success: false;
  error: string;
};

const successResult: Result = {
  success: true,
  data: { message: "Operation successful!" },
};

const errorResult: Result = {
  success: false,
  error: "An error occurred.",
};

تایپ Result یک تایپ اجتماع است که می‌تواند یا یک موفقیت با داده باشد یا یک شکست با پیام خطا. این برای نمایش نتیجه عملیاتی که ممکن است موفق یا ناموفق باشند، مفید است.

مثال تایپ اشتراک


type Person = {
  name: string;
  age: number;
};

type Employee = {
  employeeId: string;
  department: string;
};

type EmployeePerson = Person & Employee;

const employee: EmployeePerson = {
  name: "Bob Johnson",
  age: 35,
  employeeId: "EMP123",
  department: "Engineering",
};

تایپ EmployeePerson یک تایپ اشتراک است که ویژگی‌های هر دو تایپ Person و Employee را ترکیب می‌کند. این به شما امکان می‌دهد با ترکیب تایپ‌های موجود، تایپ‌های جدیدی ایجاد کنید.

تفاوت‌های کلیدی: اینترفیس در مقابل تایپ

اگرچه هم اینترفیس‌ها و هم تایپ‌ها برای تعریف ساختارهای داده در TypeScript به کار می‌روند، اما تفاوت‌های کلیدی وجود دارد که بر زمان استفاده از یکی به جای دیگری تأثیر می‌گذارد:

  1. ادغام تعاریف: اینترفیس‌ها از ادغام تعاریف پشتیبانی می‌کنند، در حالی که تایپ‌ها این کار را نمی‌کنند. اگر نیاز به گسترش یک تعریف تایپ در چندین فایل یا ماژول دارید، اینترفیس‌ها عموماً ترجیح داده می‌شوند.
  2. تایپ‌های اجتماع: تایپ‌ها می‌توانند تایپ‌های اجتماع را نمایندگی کنند، در حالی که اینترفیس‌ها نمی‌توانند به طور مستقیم اجتماع‌ها را تعریف کنند. اگر نیاز به تعریف یک تایپ دارید که می‌تواند یکی از چندین نوع مختلف باشد، از یک نام مستعار تایپ استفاده کنید.
  3. تایپ‌های اشتراک: تایپ‌ها می‌توانند با استفاده از عملگر & تایپ‌های اشتراک ایجاد کنند. اینترفیس‌ها می‌توانند اینترفیس‌های دیگر را گسترش دهند و به اثری مشابه دست یابند، اما تایپ‌های اشتراک انعطاف‌پذیری بیشتری ارائه می‌دهند.
  4. تایپ‌های اولیه: تایپ‌ها می‌توانند به طور مستقیم انواع اولیه (رشته، عدد، بولین) را نمایندگی کنند، در حالی که اینترفیس‌ها عمدتاً برای تعریف اشکال اشیاء طراحی شده‌اند.
  5. پیام‌های خطا: برخی از توسعه‌دهندگان معتقدند که اینترفیس‌ها پیام‌های خطای کمی واضح‌تری نسبت به تایپ‌ها ارائه می‌دهند، به ویژه هنگام کار با ساختارهای تایپ پیچیده.

بهترین شیوه‌ها: انتخاب بین اینترفیس و تایپ

انتخاب بین اینترفیس‌ها و تایپ‌ها به نیازهای خاص پروژه و ترجیحات شخصی شما بستگی دارد. در اینجا چند دستورالعمل کلی برای در نظر گرفتن وجود دارد:

مثال‌های عملی: سناریوهای اپلیکیشن جهانی

بیایید چند مثال عملی را برای نشان دادن چگونگی استفاده از اینترفیس‌ها و تایپ‌ها در یک اپلیکیشن جهانی در نظر بگیریم:

۱. مدیریت پروفایل کاربر (بین‌المللی‌سازی)

فرض کنید در حال ساخت یک سیستم مدیریت پروفایل کاربر هستید که از چندین زبان پشتیبانی می‌کند. می‌توانید از اینترفیس‌ها برای تعریف ساختار پروفایل‌های کاربری و از تایپ‌ها برای نمایش کدهای زبان‌های مختلف استفاده کنید:


interface UserProfile {
  id: number;
  name: string;
  email: string;
  preferredLanguage: LanguageCode;
  address: Address;
}

interface Address {
    street: string;
    city: string;
    country: string;
    postalCode: string;
}

type LanguageCode = "en" | "fr" | "es" | "de" | "zh"; // کدهای زبان نمونه

const userProfile: UserProfile = {
  id: 1,
  name: "John Doe",
  email: "john.doe@example.com",
  preferredLanguage: "en",
  address: { street: "123 Main St", city: "Anytown", country: "USA", postalCode: "12345" }
};

در اینجا، اینترفیس UserProfile ساختار یک پروفایل کاربر، از جمله زبان ترجیحی او را تعریف می‌کند. تایپ LanguageCode یک تایپ اجتماع است که زبان‌های پشتیبانی شده را نمایندگی می‌کند. اینترفیس Address فرمت آدرس را با فرض یک فرمت عمومی جهانی تعریف می‌کند.

۲. تبدیل ارز (جهانی‌سازی)

یک اپلیکیشن تبدیل ارز را در نظر بگیرید که نیاز به مدیریت ارزهای مختلف و نرخ‌های تبدیل دارد. می‌توانید از اینترفیس‌ها برای تعریف ساختار اشیاء ارز و از تایپ‌ها برای نمایش کدهای ارز استفاده کنید:


interface Currency {
  code: CurrencyCode;
  name: string;
  symbol: string;
}

interface ExchangeRate {
  baseCurrency: CurrencyCode;
  targetCurrency: CurrencyCode;
  rate: number;
}


type CurrencyCode = "USD" | "EUR" | "GBP" | "JPY" | "CAD"; // کدهای ارز نمونه

const usd: Currency = {
  code: "USD",
  name: "United States Dollar",
  symbol: "$",
};

const exchangeRate: ExchangeRate = {
  baseCurrency: "USD",
  targetCurrency: "EUR",
  rate: 0.85,
};

اینترفیس Currency ساختار یک شیء ارز، از جمله کد، نام و نماد آن را تعریف می‌کند. تایپ CurrencyCode یک تایپ اجتماع است که کدهای ارز پشتیبانی شده را نمایندگی می‌کند. اینترفیس ExchangeRate برای نمایش نرخ‌های تبدیل بین ارزهای مختلف استفاده می‌شود.

۳. اعتبارسنجی داده‌ها (فرمت بین‌المللی)

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


type PhoneNumber = {
  countryCode: string;
  number: string;
  isValid: boolean; // یک بولین برای نمایش داده معتبر/نامعتبر اضافه کنید.
};

interface Contact {
   name: string;
   phoneNumber: PhoneNumber;
   email: string;
}


function validatePhoneNumber(phoneNumber: string, countryCode: string): PhoneNumber {
  // منطق اعتبارسنجی بر اساس کد کشور (مثلاً با استفاده از کتابخانه‌ای مانند libphonenumber-js)
  // ... پیاده‌سازی برای اعتبارسنجی شماره در اینجا قرار می‌گیرد.
  const isValid = true; //مقدار موقت

  return { countryCode, number: phoneNumber, isValid };
}

const contact: Contact = {
    name: "Jane Doe",
    phoneNumber: validatePhoneNumber("555-123-4567", "US"), //مثال
    email: "jane.doe@email.com",
};


console.log(contact.phoneNumber.isValid); //خروجی بررسی اعتبارسنجی.

نتیجه‌گیری: تسلط بر تعاریف TypeScript

اینترفیس‌ها و تایپ‌های TypeScript ابزارهای قدرتمندی برای تعریف ساختارهای داده و افزایش کیفیت کد هستند. درک تفاوت‌های آن‌ها و استفاده مؤثر از آن‌ها برای ساخت اپلیکیشن‌های قوی، قابل نگهداری و مقیاس‌پذیر ضروری است. با پیروی از بهترین شیوه‌های ذکر شده در این راهنما، می‌توانید تصمیمات آگاهانه‌ای در مورد زمان استفاده از اینترفیس‌ها و تایپ‌ها بگیرید و در نهایت، گردش کار توسعه TypeScript خود را بهبود بخشیده و به موفقیت پروژه‌های خود کمک کنید.

به یاد داشته باشید که انتخاب بین اینترفیس‌ها و تایپ‌ها اغلب یک موضوع ترجیح شخصی و نیازمندی‌های پروژه است. هر دو رویکرد را آزمایش کنید تا ببینید چه چیزی برای شما و تیمتان بهتر عمل می‌کند. پذیرش قدرت سیستم تایپ TypeScript بدون شک به کدی قابل اعتمادتر و قابل نگهداری‌تر منجر خواهد شد که به نفع توسعه‌دهندگان در سراسر جهان است.