TypeScript e’lonlarni birlashtirish


ULASHISH

Deklaratsiyani birlashtirishni tushunish

Deklaratsiyani birlashtirish bir xil nomdagi bir nechta deklaratsiyalarni bitta ta’rifga birlashtirish imkonini beruvchi kuchli TypeScript xususiyatidir.

Bu sizga murakkab turlarni bosqichma-bosqich yaratish va mavjud turlarni xavfsiz tarzda kengaytirish imkonini beradi.


Asosiy afzalliklari

  • Progressive Enhancement : Turlarni bir nechta deklaratsiyalar bo‘yicha bosqichma-bosqich yarating
  • Extensibility : Asl ta’riflarni o‘zgartirmasdan mavjud turlarga yangi a’zolarni qo‘shing
  • Organization : Katta turdagi ta’riflarni mantiqiy guruhlarga bo‘ling
  • Compatibility : Zarur bo‘lganda, uchinchi tomon turi ta’riflarini kengaytiring

Umumiy foydalanish holatlari

  • O‘rnatilgan turlari va uchinchi tomon kutubxonalari turlarini kengaytirish
  • JavaScript kutubxonalari uchun turdagi ma’lumotlarni qo‘shish
  • Bir nechta fayllar bo‘ylab katta interfeyslarni tashkil qilish
  • Usul zanjiri bilan ravon API yaratish
  • Modulni kengaytirish naqshini amalga oshirish

Interfeysni birlashtirish

Xuddi shu nomdagi interfacelar avtomatik ravishda birlashtiriladi:

Misol

// First declaration
interface Person {
  name: string;
  age: number;
}

// Second declaration with the same name
interface Person {
  address: string;
  email: string;
}

// TypeScript merges them into:
// interface Person {
// name: string;
// age: number;
// address: string;
// email: string;
// }

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

console.log(person);
O‘zingiz sinab ko‘ring »


Birlashtirish bilan funksiyaning haddan tashqari yuklanishi

Amalga oshirilganda keyin birlashtiriladigan bir nechta funksiya deklaratsiyasini belgilashingiz mumkin:

Misol

// Function overloads
function processValue(value: string): string;
function processValue(value: number): number;
function processValue(value: boolean): boolean;

// Implementation that handles all overloads
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;
  }
}

// Using the function with different types
console.log(processValue("hello")); // "HELLO"
console.log(processValue(10)); // 20
console.log(processValue(true)); // false
O‘zingiz sinab ko‘ring »

Nom maydonini birlashtirish

Xuddi shu nomdagi nomlar birlashtiriladi:

Misol

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);
    }
  }
}

// After merging:
// namespace Validation {
// export interface StringValidator { isValid(s: string): boolean; }
// export interface NumberValidator { isValid(n: number): boolean; }
// export class ZipCodeValidator implements StringValidator { ... }
// }

// Using the merged namespace
const zipValidator = new Validation.ZipCodeValidator();

console.log(zipValidator.isValid("12345")); // true
console.log(zipValidator.isValid("1234")); // false
console.log(zipValidator.isValid("abcde")); // false
O‘zingiz sinab ko‘ring »

Class va interfeysni birlashtirish

Class deklaratsiyasi bir xil nomdagi interface bilan birlashishi mumkin:

Misol

// Interface declaration
interface Cart {
  calculateTotal(): number;
}

// Class declaration with same name
class Cart {
  items: { name: string; price: number }[] = [];

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

   // Must implement the interface method
   calculateTotal(): number {
    return this.items.reduce((sum, item) => sum + item.price, 0);
  }
}

// Using the merged class and interface
const cart = new Cart();
cart.addItem("Book", 15.99);
cart.addItem("Coffee Mug", 8.99);

console.log(`Total: $${cart.calculateTotal().toFixed(2)}`);

Raqamlarni birlashtirish

Xuddi shu nomdagi enum deklaratsiyasi birlashtiriladi:

Misol

// First part of the enum
enum Direction {
  North,
  South
}

// Second part of the enum
enum Direction {
  East = 2,
  West = 3
}

// After merging:
// enum Direction {
// North = 0,
// South = 1,
// East = 2,
// West = 3
// }

console.log(Direction.North); // 0
console.log(Direction.South); // 1
console.log(Direction.East); // 2
console.log(Direction.West); // 3

// Can also access by value
console.log(Direction[0]); // "North"
console.log(Direction[2]); // "East"
O‘zingiz sinab ko‘ring »

Modulni kengaytirish

Mavjud modullar yoki kutubxonalarni qo‘shimcha turlar va funksiyalarni e’lon qilish orqali kengaytirishingiz mumkin:

Misol

// Original library definition
// Imagine this comes from a third-party library
declare namespace LibraryModule {
  export interface User {
    id: number;
    name: string;
  }
  export function getUser(id: number): User;
}

// Augmenting with additional functionality (your code)
declare namespace LibraryModule {
  // Add new interface
  export interface UserPreferences {
    theme: string;
    notifications: boolean;
  }

  // Add new property to existing interface
  export interface User {
    preferences?: UserPreferences;
  }

  // Add new function
  export function getUserPreferences(userId: number): UserPreferences;
}

// Using the augmented module
const user = LibraryModule.getUser(123);
console.log(user.preferences?.theme);

const prefs = LibraryModule.getUserPreferences(123);
console.log(prefs.notifications);
O‘zingiz sinab ko‘ring »

Eng yaxshi amaliyotlar

Deklaratsiyani birlashtirishdan foydalanishda e’tiborga olish kerak bo‘lgan ba’zi qoidalar mavjud:

  • Order matters for function overloads : Amalga oshirish imzosi eng umumiy bo‘lishi kerak
  • Non-function members must be compatible : Agar ikkita interface bir xil nomdagi xususiyatni e’lon qilsa, turlar bir xil yoki mos bo‘lishi kerak
  • Later interfaces take precedence : Agar birlashtirilgan interfeyslarda ziddiyatlar mavjud bo‘lsa, oxirgi deklaratsiya g‘alaba qozonadi
  • Private and protected members : Agar classlar bir xil nomli, lekin har xil turdagi shaxsiy yoki himoyalangan a’zolarga ega bo‘lsa, ularni birlashtirib bo‘lmaydi.
  • Namespace exports : Birlashtirilgandan keyin faqat eksport qilingan deklaratsiyalar nom maydonidan tashqarida ko‘rinadi

Ishlash bo‘yicha mulohazalar

  • Compilation Time : Haddan tashqari deklaratsiyani birlashtirish kompilyatsiya vaqtini oshirishi mumkin
  • Type Checking : Birlashtirilgan murakkab turlar IDE ishlashiga ta’sir qilishi mumkin
  • Bundle Size : Deklaratsiyani birlashtirish ish vaqti unumdorligiga yoki to‘plam hajmiga ta’sir qilmaydi

Optimallashtirish bo‘yicha maslahatlar:

  • Birlashtirilgan interfeyslarni diqqat markazida va yaxlit holda saqlang
  • Birlashtirilgan turlarda chuqur joylashishdan saqlaning
  • Birlashtirish o‘rniga oddiy turdagi kombinatsiyalar uchun type taxalluslaridan foydalaning



W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!