فهرست سرفصل‌های TypeScript
خانه (Home) معرفی (Introduction) شروع سریع (Get Started) انواع ساده (Simple Types) تعریف صریح و استنتاج نوع (Explicit & Inference) انواع ویژه (Special Types) آرایه ها (Arrays) تاپل ها (Tuples) انواع شیء (Object Types) شمارشی ها (Enums) نام مستعار و اینترفیس ها (Aliases & Interfaces) انواع اتحادی (Union Types) توابع (Functions) تبدیل نوع (Casting) کلاس ها (Classes) جنریک های پایه (Basic Generics) انواع کاربردی (Utility Types) کلیدواژه keyof (Keyof) Null (Null) Definitely Typed (Definitely Typed) به روزرسانی های نسخه 5 (5 Updates) پیکربندی (Configuration) با Node.js (with Node.js) با React (with React) ابزارها (Tooling) انواع پیشرفته (Advanced Types) نگهبان های نوع (Type Guards) انواع شرطی (Conditional Types) انواع نگاشتی (Mapped Types) استنتاج نوع (Type Inference) انواع لیترال (Literal Types) فضای نام (Namespaces) امضاهای ایندکس (Index Signatures) ادغام اعلان ها (Declaration Merging) برنامه نویسی ناهمگام (Async Programming) دکوراتورها (Decorators) در پروژه های JS (in JS Projects) مهاجرت (Migration) مدیریت خطا (Error Handling) بهترین شیوه ها (Best Practices) ادیتور (Editor) تمرین ها (Exercises) آزمون (Quiz) سرفصل دوره (Syllabus) برنامه مطالعه (Study Plan) گواهینامه (Certificate)
نتیجه‌ای برای جستجو یافت نشد.
TypeScript

TypeScript — ادغام اعلان ها (Declaration Merging)

آخرین بروزرسانی: 1404/08/14

ادغام اعلان ها (Declaration Merging)

ادغام اعلان ها یعنی چند اعلان هم نام، یکی می شوند. بنابراین می توانی نوع ها را کم کم بسازی. مثل جمع کردن تکه های پازل در یک تصویر کامل.

ادغام رابط ها (Interface Merging)

وقتی دو «رابط (Interface)» هم نام باشند، اعضای آن ها ترکیب می شود. در نتیجه یک رابط قوی تر داریم.

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

interface Person {
  address: string;
  email: string;
}

const person: Person = {
  name: 'John',
  age: 30,
  address: '123 Main St',
  email: 'john@example.com'
};

console.log(person);

مشاهده در ادیتور

ادغام برای بارگذاری تابع (Function Overloads)

«بارگذاری تابع (Overload)» یعنی چند امضا برای یک تابع. سپس یک پیاده سازی کلی می نویسیم.

function processValue(value: string): string;
function processValue(value: number): number;
function processValue(value: boolean): boolean;

function processValue(value: string | number | boolean): string | number | boolean {
  if (typeof value === 'string') {
    return value.toUpperCase();
  } else if (typeof value === 'number') {
    return value * 2;
  } else {
    return !value;
  }
}

console.log(processValue('hello'));
console.log(processValue(10));
console.log(processValue(true));

مشاهده در ادیتور

ادغام فضای نام (Namespace Merging)

دو «فضای نام (Namespace)» هم نام ادغام می شوند. بنابراین می توانی بخش ها را جدا کنی، ولی خروجی یکی باشد.

namespace Validation {
  export interface StringValidator {
    isValid(s: string): boolean;
  }
}

namespace Validation {
  export interface NumberValidator {
    isValid(n: number): boolean;
  }

  export class ZipCodeValidator implements StringValidator {
    isValid(s: string): boolean {
      return s.length === 5 && /^\d+$/.test(s);
    }
  }
}

const zipValidator = new Validation.ZipCodeValidator();

console.log(zipValidator.isValid('12345'));
console.log(zipValidator.isValid('1234'));
console.log(zipValidator.isValid('abcde'));

مشاهده در ادیتور

ادغام کلاس و رابط

کلاس می تواند با رابط هم نام ادغام شود. بنابراین کلاس باید متدهای رابط را داشته باشد.

interface Cart {
  calculateTotal(): number;
}

class Cart {
  items: { name: string; price: number }[] = [];

  addItem(name: string, price: number): void {
    this.items.push({ name: name, price: price });
  }

  calculateTotal(): number {
    return this.items.reduce((sum, item) => sum + item.price, 0);
  }
}

const cart = new Cart();
cart.addItem('Book', 15.99);
cart.addItem('Coffee Mug', 8.99);

console.log('Total: $' + cart.calculateTotal().toFixed(2));

مشاهده در ادیتور

ادغام شمارشی ها (Enum Merging)

«شمارشی (Enum)» های هم نام ترکیب می شوند. در نتیجه اعضا کنار هم قرار می گیرند.

enum Direction {
  North,
  South
}

enum Direction {
  East = 2,
  West = 3
}

console.log(Direction.North);
console.log(Direction.South);
console.log(Direction.East);
console.log(Direction.West);

console.log(Direction[0]);
console.log(Direction[2]);

مشاهده در ادیتور

افزودن به ماژول ها (Module Augmentation)

می توانی ماژول یا کتابخانه موجود را گسترش دهی. این کار در فایل اعلان انجام می شود.

declare namespace LibraryModule {
  export interface User {
    id: number;
    name: string;
  }
  export function getUser(id: number): User;
}

declare namespace LibraryModule {
  export interface UserPreferences {
    theme: string;
    notifications: boolean;
  }

  export interface User {
    preferences?: UserPreferences;
  }

  export function getUserPreferences(userId: number): UserPreferences;
}

const user = LibraryModule.getUser(123);
console.log(user.preferences?.theme);

const prefs = LibraryModule.getUserPreferences(123);
console.log(prefs.notifications);

مشاهده در ادیتور

گام های عملی

  1. نام مشترک را انتخاب کن.
  2. اعلان ها را جداگانه بنویس.
  3. سازگاری نوع ها را بررسی کن.
  4. برای توابع، ترتیب بارگذاری را درست بگذار.
  5. برای ماژول ها، از اعلان استفاده کن.

جمع بندی سریع

  • ادغام اعلان ها نوع ها را تکمیل می کند.
  • رابط، فضا نام، Enum و بیشتر پشتیبانی می شوند.
  • ترتیب امضاهای تابع مهم است.
  • افزودن به ماژول ها در اعلان انجام می شود.

نکته: برای پروژه های مدرن، ماژول های ES معمولاً بهترند. اما ادغام اعلان ها برای سناریوهای کتابخانه و کدهای قدیمی عالی است.

برای ادامه مسیر، صفحه امضای ایندکس تایپ اسکریپت را ببین. همچنین درباره فضای نام تایپ اسکریپت بیشتر بخوان. اگر آماده ای، سراغ Async در تایپ اسکریپت برو.