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

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

اینترفیس در TypeScript چیست؟

اینترفیس، یک قرارداد رسمی است که ساختار یک شیء را تعریف می‌کند. در TypeScript، اینترفیس تعیین می‌کند که یک شیء چه ویژگی‌ها و متدهایی باید داشته باشد.

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

چرا اینترفیس خطاها را کاهش می‌دهد؟

  • شناسایی خطاها در زمان Compile، نه Runtime.
  • اطمینان از هم‌راستایی ساختار داده بین بخش‌های مختلف کد.
  • تکمیل خودکار بهتر در IDE.
  • مستندسازی خودکار ساختار داده.
  • تسهیل Refactoring.

ساختار و نحو تعریف

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

پراپرتی‌های اختیاری و اجباری

interface User {
id: number;
name: string;
email?: string; // اختیاری
}

Readonly و Immutability

interface Config {
readonly apiKey: string;
readonly baseUrl: string;
}

تعریف متدها

interface Calculator {
add(a: number, b: number): number;
subtract(a: number, b: number): number;
}

وراثت و Extends

interface Animal {
name: string;
}
interface Dog extends Animal {
breed: string;
}

پیاده‌سازی با Implements

class UserService implements User {
id = 1;
name = 'Ali';
email = 'ali@example.com';
}

تفاوت Interface و Type Alias

ویژگیInterfaceType Alias
Declare Mergeبلهخیر
Extendsبلهبله
Union Typesخیربله
Tuple Typesخیربله
Performanceبهترخوب

تفاوت Interface و Class

Interface فقط یک قرارداد است و کد اجرایی ندارد. Class هم قرارداد و هم پیاده‌سازی دارد.

Index Signature و دیکشنری‌ها

interface StringMap {
[key: string]: string;
}

اینترفیس و Generics

interface ApiResponse<T> {
data: T;
status: number;
message: string;
}

تعریف نوع توابع

interface Formatter {
(input: string): string;
}

کاربرد در پروژه‌های واقعی

  • تعریف ساختار داده API.
  • تعریف Props کامپوننت‌های React.
  • تعریف State در Redux.
  • تعریف مدل‌های دامنه.
  • تعریف قرارداد Serviceها.

برای درک عمیق‌تر، مقاله تعریف Interface حرفه‌ای برای آبجکت‌ها در TypeScript را مطالعه کنید.

چگونه اینترفیس از خطا جلوگیری می‌کند؟

  • تشخیص ویژگی‌های ناموجود در زمان Compile.
  • تشخیص نوع نادرست.
  • تشخیص اشتباه در نام‌گذاری.
  • تشخیص خطاهای ساختاری در اشیاء تودرتو.
  • تضمین هم‌راستایی بین Producer و Consumer.
  • کاهش باگ‌های زمان Runtime.
«هر خطای Type که در Compile شناسایی شود، یک باگ Runtime است که هرگز رخ نمی‌دهد.»

رویکردهای توصیه‌شده

  • استفاده از Interface برای قراردادهای عمومی.
  • استفاده از Type برای Union و Utility.
  • Prefix کردن نام Interface با I در برخی سبک‌ها.
  • تعریف Interfaceهای کوچک و متمرکز.
  • استفاده از Generic برای انعطاف‌پذیری.
  • پرهیز از Interfaceهای غول‌پیکر.
  • مستندسازی Interfaceهای عمومی.

اشتباهات رایج

اشتباهاثر
استفاده از any به‌جای Interfaceاز دست دادن Type Safety
Interface غول‌پیکردشواری نگهداری
نبود Readonly در داده‌های ثابتتغییر ناخواسته
Duplicate Interfaceسردرگمی
نبود Optional در فیلدهای اختیاریخطای Compile
نادیده گرفتن Index Signatureخطا در دیکشنری‌ها
نبود مستندسازیکاهش خوانایی

پرسش‌های پرتکرار

Interface چیست و چه کاربردی دارد؟

Interface قراردادی است که ساختار یک شیء را تعریف می‌کند و از خطاهای زمان Compile جلوگیری می‌کند.

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

Interface برای اشیاء و Classها مناسب است و از Declare Merge پشتیبانی می‌کند. Type برای Union، Tuple و انواع پیچیده‌تر.

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

خیر. Interface تنها در زمان Compile وجود دارد و به JavaScript تبدیل نمی‌شود.

چگونه از Interface در React استفاده کنم؟

با تعریف Interface برای Props کامپوننت‌ها، State و Context.

آیا می‌توان Interface را Extend کرد؟

بله، با استفاده از extends.

آیا می‌توان Interface را پیاده‌سازی کرد؟

بله، با implements در Class.

چگونه Interface را برای توابع تعریف کنم؟

با استفاده از Call Signature در Interface.

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

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

آیا Interface بر عملکرد اثر دارد؟

خیر. Interface در Runtime حذف می‌شود.

پایان‌بندی

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

از منظر مهندسی سطح ارشد، سه اصل در استفاده از Interface تعیین‌کننده است: تعریف Interfaceهای کوچک و متمرکز، استفاده از Generic برای انعطاف‌پذیری و مستندسازی Interfaceهای عمومی.

برای درک عمیق‌تر، مقاله تایپ اسکریپت از صفر و مقاله تعریف Interface حرفه‌ای برای آبجکت‌ها در TypeScript را مطالعه کنید.

اگر در پروژه‌های خود تجربه‌ای از استفاده از Interface داشته‌اید، برایتان جالب است بدانید کدام جنبه بیشترین اثر را در کاهش خطا داشت. تجربه‌تان را در دیدگاه‌ها بنویسید. 💻