ادغام اعلان ها (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);
گام های عملی
- نام مشترک را انتخاب کن.
- اعلان ها را جداگانه بنویس.
- سازگاری نوع ها را بررسی کن.
- برای توابع، ترتیب بارگذاری را درست بگذار.
- برای ماژول ها، از اعلان استفاده کن.
جمع بندی سریع
- ادغام اعلان ها نوع ها را تکمیل می کند.
- رابط، فضا نام، Enum و بیشتر پشتیبانی می شوند.
- ترتیب امضاهای تابع مهم است.
- افزودن به ماژول ها در اعلان انجام می شود.
نکته: برای پروژه های مدرن، ماژول های ES معمولاً بهترند. اما ادغام اعلان ها برای سناریوهای کتابخانه و کدهای قدیمی عالی است.
برای ادامه مسیر، صفحه امضای ایندکس تایپ اسکریپت را ببین. همچنین درباره فضای نام تایپ اسکریپت بیشتر بخوان. اگر آماده ای، سراغ Async در تایپ اسکریپت برو.