فارسی

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

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

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

درک ادغام اعلان

ادغام اعلان در تایپ‌اسکریپت زمانی اتفاق می‌افتد که کامپایلر با چندین اعلان با نام یکسان در یک حوزه (scope) مواجه می‌شود. سپس کامپایلر این اعلان‌ها را در یک تعریف واحد ادغام می‌کند. این رفتار برای اینترفیس‌ها، فضاهای نام (namespaces)، کلاس‌ها و enumها اعمال می‌شود. هنگام ادغام اینترفیس‌ها، تایپ‌اسکریپت اعضای هر اعلان اینترفیس را در یک اینترفیس واحد ترکیب می‌کند.

مفاهیم کلیدی

توسعه اینترفیس با ادغام اعلان

توسعه اینترفیس از طریق ادغام اعلان، روشی تمیز و امن از نظر نوع (type-safe) برای افزودن خصوصیات و متدها به اینترفیس‌های موجود فراهم می‌کند. این امر به ویژه هنگام کار با کتابخانه‌های خارجی یا زمانی که نیاز به سفارشی‌سازی رفتار کامپوننت‌های موجود بدون تغییر کد منبع اصلی آنها دارید، مفید است. به جای تغییر اینترفیس اصلی، می‌توانید یک اینترفیس جدید با همان نام تعریف کرده و توسعه‌های مورد نظر را به آن اضافه کنید.

مثال پایه

بیایید با یک مثال ساده شروع کنیم. فرض کنید یک اینترفیس به نام Person دارید:

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

حالا، می‌خواهید یک خصوصیت اختیاری email به اینترفیس Person اضافه کنید بدون اینکه اعلان اصلی را تغییر دهید. می‌توانید این کار را با استفاده از ادغام اعلان انجام دهید:

interface Person {
  email?: string;
}

تایپ‌اسکریپت این دو اعلان را در یک اینترفیس واحد Person ادغام می‌کند:

interface Person {
  name: string;
  age: number;
  email?: string;
}

اکنون، می‌توانید از اینترفیس توسعه‌یافته Person با خصوصیت جدید email استفاده کنید:

const person: Person = {
  name: "Alice",
  age: 30,
  email: "alice@example.com",
};

const anotherPerson: Person = {
  name: "Bob",
  age: 25,
};

console.log(person.email); // Output: alice@example.com
console.log(anotherPerson.email); // Output: undefined

توسعه اینترفیس‌ها از کتابخانه‌های خارجی

یک مورد استفاده رایج برای ادغام اعلان، توسعه اینترفیس‌های تعریف شده در کتابخانه‌های خارجی است. فرض کنید از کتابخانه‌ای استفاده می‌کنید که یک اینترفیس به نام Product ارائه می‌دهد:

// From an external library
interface Product {
  id: number;
  name: string;
  price: number;
}

شما می‌خواهید یک خصوصیت description به اینترفیس Product اضافه کنید. می‌توانید این کار را با تعریف یک اینترفیس جدید با همان نام انجام دهید:

// In your code
interface Product {
  description?: string;
}

اکنون، می‌توانید از اینترفیس توسعه‌یافته Product با خصوصیت جدید description استفاده کنید:

const product: Product = {
  id: 123,
  name: "Laptop",
  price: 1200,
  description: "A powerful laptop for professionals",
};

console.log(product.description); // Output: A powerful laptop for professionals

مثال‌های عملی و موارد استفاده

بیایید چند مثال عملی و موارد استفاده دیگر را بررسی کنیم که در آنها توسعه اینترفیس با ادغام اعلان می‌تواند به ویژه مفید باشد.

۱. افزودن خصوصیات به اشیاء Request و Response

هنگام ساخت برنامه‌های وب با فریم‌ورک‌هایی مانند Express.js، اغلب نیاز به افزودن خصوصیات سفارشی به اشیاء درخواست (request) یا پاسخ (response) دارید. ادغام اعلان به شما امکان می‌دهد تا اینترفیس‌های موجود درخواست و پاسخ را بدون تغییر کد منبع فریم‌ورک توسعه دهید.

مثال:

// Express.js
import express from 'express';

// Extend the Request interface
declare global {
  namespace Express {
    interface Request {
      userId?: string;
    }
  }
}

const app = express();

app.use((req, res, next) => {
  // Simulate authentication
  req.userId = "user123";
  next();
});

app.get('/', (req, res) => {
  const userId = req.userId;
  res.send(`Hello, user ${userId}!`);
});

app.listen(3000, () => {
  console.log('Server listening on port 3000');
});

در این مثال، ما در حال توسعه اینترفیس Express.Request هستیم تا یک خصوصیت userId اضافه کنیم. این به ما امکان می‌دهد شناسه کاربر را در شیء درخواست هنگام احراز هویت ذخیره کرده و در میان‌افزارها و کنترل‌کننده‌های مسیر بعدی به آن دسترسی داشته باشیم.

۲. توسعه اشیاء پیکربندی

اشیاء پیکربندی معمولاً برای تنظیم رفتار برنامه‌ها و کتابخانه‌ها استفاده می‌شوند. ادغام اعلان می‌تواند برای توسعه اینترفیس‌های پیکربندی با خصوصیات اضافی مختص برنامه شما استفاده شود.

مثال:

// Library configuration interface
interface Config {
  apiUrl: string;
  timeout: number;
}

// Extend the configuration interface
interface Config {
  debugMode?: boolean;
}

const defaultConfig: Config = {
  apiUrl: "https://api.example.com",
  timeout: 5000,
  debugMode: true,
};

// Function that uses the configuration
function fetchData(config: Config) {
  console.log(`Fetching data from ${config.apiUrl}`);
  console.log(`Timeout: ${config.timeout}ms`);
  if (config.debugMode) {
    console.log("Debug mode enabled");
  }
}

fetchData(defaultConfig);

در این مثال، ما در حال توسعه اینترفیس Config هستیم تا یک خصوصیت debugMode اضافه کنیم. این به ما امکان می‌دهد حالت اشکال‌زدایی را بر اساس شیء پیکربندی فعال یا غیرفعال کنیم.

۳. افزودن متدهای سفارشی به کلاس‌های موجود (Mixins)

در حالی که ادغام اعلان عمدتاً با اینترفیس‌ها سروکار دارد، می‌توان آن را با سایر ویژگی‌های تایپ‌اسکریپت مانند mixinها ترکیب کرد تا متدهای سفارشی به کلاس‌های موجود اضافه شود. این امر راهی انعطاف‌پذیر و ترکیبی برای توسعه عملکرد کلاس‌ها فراهم می‌کند.

مثال:

// Base class
class Logger {
  log(message: string) {
    console.log(`[LOG]: ${message}`);
  }
}

// Interface for the mixin
interface Timestamped {
  timestamp: Date;
  getTimestamp(): string;
}

// Mixin function
function Timestamped(Base: T) {
  return class extends Base implements Timestamped {
    timestamp: Date = new Date();

    getTimestamp(): string {
      return this.timestamp.toISOString();
    }
  };
}

type Constructor = new (...args: any[]) => {};

// Apply the mixin
const TimestampedLogger = Timestamped(Logger);

// Usage
const logger = new TimestampedLogger();
logger.log("Hello, world!");
console.log(logger.getTimestamp());

در این مثال، ما یک mixin به نام Timestamped ایجاد می‌کنیم که یک خصوصیت timestamp و یک متد getTimestamp به هر کلاسی که روی آن اعمال شود اضافه می‌کند. در حالی که این به طور مستقیم از ادغام اینترفیس به ساده‌ترین شکل استفاده نمی‌کند، نشان می‌دهد که چگونه اینترفیس‌ها قرارداد کلاس‌های تقویت‌شده را تعریف می‌کنند.

حل تعارض

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

انواع متناقض

اگر دو اینترفیس اعضایی با نام یکسان اما انواع ناسازگار تعریف کنند، کامپایلر خطا صادر می‌کند.

مثال:

interface A {
  x: number;
}

interface A {
  x: string; // Error: Subsequent property declarations must have the same type.
}

برای حل این تعارض، باید اطمینان حاصل کنید که انواع سازگار هستند. یک راه برای انجام این کار استفاده از یک نوع union است:

interface A {
  x: number | string;
}

interface A {
  x: string | number;
}

در این حالت، هر دو اعلان سازگار هستند زیرا نوع x در هر دو اینترفیس number | string است.

سربارگذاری توابع (Function Overloads)

هنگام ادغام اینترفیس‌ها با اعلان‌های تابع، تایپ‌اسکریپت سربارگذاری‌های تابع را در یک مجموعه واحد از سربارگذاری‌ها ادغام می‌کند. کامپایلر از ترتیب سربارگذاری‌ها برای تعیین سربارگذاری صحیح در زمان کامپایل استفاده می‌کند.

مثال:

interface Calculator {
  add(x: number, y: number): number;
}

interface Calculator {
  add(x: string, y: string): string;
}

const calculator: Calculator = {
  add(x: number | string, y: number | string): number | string {
    if (typeof x === 'number' && typeof y === 'number') {
      return x + y;
    } else if (typeof x === 'string' && typeof y === 'string') {
      return x + y;
    } else {
      throw new Error('Invalid arguments');
    }
  },
};

console.log(calculator.add(1, 2)); // Output: 3
console.log(calculator.add("hello", "world")); // Output: hello world

در این مثال، ما در حال ادغام دو اینترفیس Calculator با سربارگذاری‌های تابع مختلف برای متد add هستیم. تایپ‌اسکریپت این سربارگذاری‌ها را در یک مجموعه واحد ادغام می‌کند و به ما امکان می‌دهد متد add را با اعداد یا رشته‌ها فراخوانی کنیم.

بهترین شیوه‌ها برای توسعه اینترفیس

برای اطمینان از اینکه از توسعه اینترفیس به طور مؤثر استفاده می‌کنید، این بهترین شیوه‌ها را دنبال کنید:

سناریوهای پیشرفته

فراتر از مثال‌های پایه، ادغام اعلان قابلیت‌های قدرتمندی را در سناریوهای پیچیده‌تر ارائه می‌دهد.

توسعه اینترفیس‌های جنریک (Generic)

شما می‌توانید اینترفیس‌های جنریک را با استفاده از ادغام اعلان توسعه دهید و ایمنی نوع و انعطاف‌پذیری را حفظ کنید.

interface DataStore {
  data: T[];
  add(item: T): void;
}

interface DataStore {
  find(predicate: (item: T) => boolean): T | undefined;
}

class MyDataStore implements DataStore {
  data: T[] = [];

  add(item: T): void {
    this.data.push(item);
  }

  find(predicate: (item: T) => boolean): T | undefined {
    return this.data.find(predicate);
  }
}

const numberStore = new MyDataStore();
numberStore.add(1);
numberStore.add(2);
const foundNumber = numberStore.find(n => n > 1);
console.log(foundNumber); // Output: 2

ادغام شرطی اینترفیس

اگرچه این یک ویژگی مستقیم نیست، اما می‌توانید با استفاده از انواع شرطی (conditional types) و ادغام اعلان به اثرات ادغام شرطی دست یابید.

interface BaseConfig {
  apiUrl: string;
}

type FeatureFlags = {
  enableNewFeature: boolean;
};

// Conditional interface merging
interface BaseConfig {
  featureFlags?: FeatureFlags;
}

interface EnhancedConfig extends BaseConfig {
  featureFlags: FeatureFlags;
}

function processConfig(config: BaseConfig) {
  console.log(config.apiUrl);
  if (config.featureFlags?.enableNewFeature) {
    console.log("New feature is enabled");
  }
}

const configWithFlags: EnhancedConfig = {
  apiUrl: "https://example.com",
  featureFlags: {
    enableNewFeature: true,
  },
};

processConfig(configWithFlags);

مزایای استفاده از ادغام اعلان

محدودیت‌های ادغام اعلان

نتیجه‌گیری

ادغام اعلان تایپ‌اسکریپت ابزاری قدرتمند برای توسعه اینترفیس‌ها و سفارشی‌سازی رفتار کد شماست. با درک نحوه عملکرد ادغام اعلان و پیروی از بهترین شیوه‌ها، می‌توانید از این ویژگی برای ساخت برنامه‌های قوی، مقیاس‌پذیر و قابل نگهداری استفاده کنید. این راهنما یک نمای کلی جامع از توسعه اینترفیس از طریق ادغام اعلان ارائه داده و شما را به دانش و مهارت‌های لازم برای استفاده مؤثر از این تکنیک در پروژه‌های تایپ‌اسکریپت خود مجهز کرده است. به یاد داشته باشید که ایمنی نوع را در اولویت قرار دهید، تعارضات احتمالی را در نظر بگیرید و توسعه‌های خود را برای اطمینان از وضوح و قابلیت نگهداری کد مستند کنید.