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

در پروژه‌های واقعی Angular، React و Node.js تقریباً همیشه با Interface سروکار خواهید داشت. Interface به ما کمک می‌کند ساختار داده‌ها، آبجکت‌ها و کلاس‌ها را به صورت استاندارد تعریف کنیم و از بروز خطاهای احتمالی جلوگیری کنیم.

در این جلسه یاد می‌گیریم:

  • Interface چیست؟
  • چرا باید از Interface استفاده کنیم؟
  • تعریف Interface برای Object
  • Interface در توابع
  • Interface در کلاس‌ها
  • Interface Extension
  • تفاوت Interface و Type Alias
  • بهترین روش استفاده در پروژه‌های واقعی

Interface چیست؟

Interface در TypeScript یک قرارداد (Contract) برای تعریف ساختار داده‌ها است.

به زبان ساده، Interface مشخص می‌کند یک Object باید چه ویژگی‌هایی داشته باشد.

مثال:

interface User {
  id: number;
  name: string;
}

اکنون هر شیء که از User استفاده کند باید این ساختار را رعایت کند.

const user: User = {
  id: 1,
  name: "Ali"
};

چرا از Interface استفاده کنیم؟

بدون Interface:

const user1: {
  id: number;
  name: string;
} = {
  id: 1,
  name: "Ali"
};

const user2: {
  id: number;
  name: string;
} = {
  id: 2,
  name: "Sara"
};

مشکل چیست؟

ساختار داده را بارها تکرار کرده‌ایم.

راه بهتر:

interface User {
  id: number;
  name: string;
}

استفاده:

const user1: User = {
  id: 1,
  name: "Ali"
};

const user2: User = {
  id: 2,
  name: "Sara"
};

کد خواناتر و نگهداری آن بسیار ساده‌تر می‌شود.


Property های اختیاری در Interface

گاهی برخی فیلدها الزامی نیستند.

interface User {
  id: number;
  name: string;
  email?: string;
}

اکنون email اختیاری است.

const user: User = {
  id: 1,
  name: "Ali"
};

Readonly Property

گاهی نمی‌خواهیم مقدار یک فیلد تغییر کند.

interface User {
  readonly id: number;
  name: string;
}
const user: User = {
  id: 1,
  name: "Ali"
};

user.id = 5;

TypeScript خطا خواهد داد.


Interface برای Function

می‌توان ساختار توابع را نیز تعریف کرد.

interface SumFunction {
  (
    a: number,
    b: number
  ): number;
}

استفاده:

const sum: SumFunction = (
  a,
  b
) => a + b;

Interface برای Array

interface Product {
  id: number;
  title: string;
}

const products: Product[] = [
  {
    id: 1,
    title: "Laptop"
  },
  {
    id: 2,
    title: "Phone"
  }
];

Interface Extension

یکی از قابلیت‌های قدرتمند Interface امکان ارث‌بری است.

interface Person {
  name: string;
}

interface User extends Person {
  id: number;
}

استفاده:

const user: User = {
  id: 1,
  name: "Ali"
};

Interface در Class

در پروژه‌های بزرگ بسیار کاربرد دارد.

interface User {
  id: number;
  name: string;
}
class Customer
  implements User {

  constructor(
    public id: number,
    public name: string
  ) {}
}

TypeScript بررسی می‌کند که کلاس تمامی ویژگی‌های Interface را پیاده‌سازی کرده باشد.


Interface در Angular

در Angular معمولاً برای مدل API استفاده می‌شود.

export interface Hotel {
  id: number;
  name: string;
  city: string;
  price: number;
}

سرویس:

getHotels():
Observable<Hotel[]> {

  return this.http.get<
    Hotel[]
  >('/api/hotels');
}

مزیت:

  • IntelliSense بهتر
  • خطایابی سریع‌تر
  • توسعه آسان‌تر

تفاوت Interface و Type Alias

جلسه قبل با Type Alias آشنا شدیم.

مثال Type Alias:

type User = {
  id: number;
  name: string;
};

مثال Interface:

interface User {
  id: number;
  name: string;
}

در تعریف Object تقریباً مشابه هستند.

اما تفاوت‌هایی دارند.


Interface قابلیت Declaration Merging دارد

interface User {
  name: string;
}

interface User {
  age: number;
}

خروجی:

interface User {
  name: string;
  age: number;
}

اما در Type Alias این کار مجاز نیست.


Type Alias برای Union Type مناسب‌تر است

type Status =
  | "loading"
  | "success"
  | "error";

این ساختار را نمی‌توان با Interface تعریف کرد.


Type Alias برای Primitive Type

type UserId = number;

Interface چنین قابلیتی ندارد.


چه زمانی از Interface استفاده کنیم؟

برای:

  • مدل داده‌ها
  • API Response
  • کلاس‌ها
  • ساختار Object ها

Interface انتخاب مناسب‌تری است.


چه زمانی از Type Alias استفاده کنیم؟

برای:

  • Union Types
  • Primitive Types
  • Tuple Types
  • Function Types پیچیده

Type Alias گزینه بهتری است.


بهترین روش در پروژه‌های واقعی

در پروژه‌های Angular و React معمولاً این قانون استفاده می‌شود:

  • برای Object ها از Interface
  • برای Union Type ها از Type Alias

مثال:

interface User {
  id: number;
  name: string;
}

type UserStatus =
  | "active"
  | "inactive";

این روش خوانایی پروژه را افزایش می‌دهد.


جمع‌بندی

Interface یکی از مهم‌ترین ابزارهای TypeScript برای تعریف ساختار داده‌ها است.

مزایا:

  • خوانایی بیشتر
  • جلوگیری از خطا
  • پشتیبانی از Extension
  • پشتیبانی از Class ها
  • مناسب برای مدل‌های داده

در پروژه‌های حرفه‌ای Angular تقریباً تمام Model ها و API Response ها با Interface تعریف می‌شوند.

در کنار Type Alias، Interface یکی از مهم‌ترین مفاهیمی است که هر توسعه‌دهنده TypeScript باید به آن مسلط باشد.


سوالات متداول (FAQ)

Interface در TypeScript چیست؟

ابزاری برای تعریف ساختار و قرارداد داده‌ها در TypeScript است.

تفاوت Interface و Type Alias چیست؟

Interface بیشتر برای Object ها و Class ها استفاده می‌شود اما Type Alias برای Union Type و Primitive Type مناسب‌تر است.

آیا Interface در JavaScript وجود دارد؟

خیر. Interface فقط در زمان توسعه توسط TypeScript استفاده می‌شود و در خروجی JavaScript حذف خواهد شد.

در Angular بهتر است از Interface استفاده کنیم یا Type Alias؟

برای مدل‌های داده و پاسخ API معمولاً Interface انتخاب بهتری است.

دسترسی به ویدیوهای کامل دوره

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