TypeScript e’lonlarni birlashtirish
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
typetaxalluslaridan foydalaning
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
