TypeScript indeks signaturalari
TypeScript-da indeks imzolarini tushunish
TypeScript-dagi indeks imzolari tur xavfsizligini ta’minlashda dinamik xususiyat nomlari bo‘lgan obyektlar turlarini aniqlashning kuchli usulini ta’minlaydi.
Ular qavs belgisi ( obj[key] ) orqali kirish mumkin bo‘lgan qiymat turlarini belgilash imkonini beradi, hattoki aniq xususiyat nomlari oldindan ma’lum bo‘lmasa ham.
Asosiy tushunchalar
- Dynamic Property Access : Ixtiyoriy xususiyat nomlari bo‘lgan obyektlarni boshqarish
- Type Safety : Dinamik xususiyatlar bo‘yicha izchil qiymat turlarini ta’minlang
- Flexible Data Structures : Model lug‘atlar, Map’lar va boshqa dinamik ma’lumotlar
- Runtime Safety : Kompilyatsiya vaqtida turga bog‘liq xatolarni aniqlang
Asosiy indeks imzolari
String indeks imzolari
TypeScript-dagi indeks imzolari sizga xususiyat nomlarini oldindan bilmagan, lekin qiymatlar shaklini biladigan obyektlar turlarini aniqlash imkonini beradi.
Indeks imzosi obj[key] kabi indeks orqali kiriladigan xususiyatlar turlarini belgilaydi.
Misol
// This interface represents an object with string keys and string values
interface StringDictionary {
[key: string]: string;
}
// Creating a compliant object
const names: StringDictionary = {
firstName: "Alice",
lastName: "Smith",
"100": "One Hundred"
};
// Accessing properties
console.log(names["firstName"]); // "Alice"
console.log(names["lastName"]); // "Smith"
console.log(names["100"]); // "One Hundred"
// Adding new properties dynamically
names["age"] = "30";
// This would cause an error
// names["age"] = 30; // Error: Type 'number' is not assignable to type 'string'
O‘zingiz sinab ko‘ring »
Indeks signaturasi sintaksisi ruxsat etilgan xususiyat nomlari (yoki kalitlari) tiplarini tavsiflash uchun [key: type] qavslaridan foydalanadi, undan keyin esa bu xususiyatlar qabul qilishi mumkin bo‘lgan qiymatlar tipi keladi.
Raqamlar indeksi imzolari
TypeScript ham string, ham raqamli indeks imzolarini qo‘llab-quvvatlaydi:
Misol
// Object with number indexes
interface NumberDictionary {
[index: number]: any;
}
const scores: NumberDictionary = {
0: "Zero",
1: 100,
2: true
};
console.log(scores[0]); // "Zero"
console.log(scores[1]); // 100
console.log(scores[2]); // true
// Adding a complex object
scores[3] = { passed: true };
O‘zingiz sinab ko‘ring »
Eslatma: JavaScript-da barcha obyekt kalitlari stringlar, hatto sonli kalitlar sifatida saqlanadi.
Biroq, TypeScript massivlar va obyektlardan foydalanishda mantiqiy xatolarni aniqlashga yordam berish uchun farq qiladi.
Kengaytirilgan indeks imzo naqshlari
Aralash xususiyat turlari
Siz indeks imzolarini aniq xususiyat deklaratsiyasi bilan birlashtirishingiz mumkin:
Misol
interface UserInfo {
name: string; // Required property with specific name
age: number; // Required property with specific name
[key: string]: string | number; // All other properties must be string or number
}
const user: UserInfo = {
name: "Alice", // Required
age: 30, // Required
address: "123 Main St", // Optional
zipCode: 12345 // Optional
};
// This would cause an error
// const invalidUser: UserInfo = {
// name: "Bob",
// age: "thirty", // Error: Type 'string' is not assignable to type 'number'
// isAdmin: true // Error: Type 'boolean' is not assignable to type 'string | number'
// };
O‘zingiz sinab ko‘ring »
Important: Aniq xususiyatlarni indeks imzosi bilan birlashtirganda, aniq xususiyatlar turlari indeks imzosining qiymat turiga tayinlanishi kerak.
Faqat o‘qiladigan indeks imzolari
Yaratilgandan keyin o‘zgartirishni oldini olish uchun indeks imzolarini faqat o‘qish uchun qilishingiz mumkin:
Misol
interface ReadOnlyStringArray {
readonly [index: number]: string;
}
const names: ReadOnlyStringArray = ["Alice", "Bob", "Charlie"];
console.log(names[0]); // "Alice"
// This would cause an error
// names[0] = "Andrew"; // Error: Index signature in type 'ReadOnlyStringArray' only permits reading
O‘zingiz sinab ko‘ring »
Kalitlar to‘plamini cheklash va shakllarni o‘zgartirish uchun Mapped Types ga qarang.
Haqiqiy dunyo misollari
API javobini boshqarish
Misol
// Type for API responses with dynamic keys
interface ApiResponse<T> {
data: {
[resourceType: string]: T[]; // e.g., { "users": User[], "posts": Post[] }
};
meta: {
page: number;
total: number;
[key: string]: any; // Allow additional metadata
};
}
// Example usage with a users API
interface User {
id: number;
name: string;
email: string;
}
// Mock API response
const apiResponse: ApiResponse<User> = {
data: {
users: [
{ id: 1, name: "Alice", email: "alice@example.com" },
{ id: 2, name: "Bob", email: "bob@example.com" }
]
},
meta: {
page: 1,
total: 2,
timestamp: "2023-01-01T00:00:00Z"
}
};
// Accessing the data
const users = apiResponse.data.users;
console.log(users[0].name); // "Alice"
O‘zingiz sinab ko‘ring »
Eng yaxshi amaliyotlar
Qilish va qilmaslik
Qilish:
- Dinamik kalitlarga ega setlar uchun indeks imzolaridan foydalaning
- Ma’lum maydonlar uchun aniq xususiyatlar bilan birlashtiring
- Keep value types specific (avoid
any) - Mutatsiya kerak bo‘lmaganda
readonlydan foydalaning
Qilmang:
- Kalitlar ma’lum bo‘lsa, sobit interfeyslarni afzal ko‘ring
- Barcha xususiyatlar indeks imzosi turiga mos kelishi kerakligini unutmang
- Xaritalangan turlarni qayta kashf eting - o‘zgartirishlar uchun maxsus sahifadan foydalaning
Umumiy tuzoqlar
Xususiyat nomi ziddiyatlari
interface ConflictingTypes {
[key: string]: number;
name: string; // Error: not assignable to string index type 'number'
}
interface FixedTypes {
[key: string]: number | string;
name: string; // OK
age: number; // OK
}
Indeks imzolari va yozuvlar
Moslashuvchan/dinamik kalitlar va boshqa xususiyatlar bilan aralashtirishda indeks imzosidan foydalaning.
Qisqacha oddiy xaritalash uchun Record<K, T> dan foydalaning.
// Index signature
interface StringMap {
[key: string]: string;
}
// Record
type StringRecord = Record<string, string>;
Xulosa
Kalitlar dinamik, lekin qiymat shakllari mos bo‘lsa, indeks imzolaridan foydalaning.
Iloji bo‘lsa, aniq xususiyatlar bilan birlashtiring va kengaytirilgan o‘zgarishlar uchun Mapped Types va Utility Types ga qarang.
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
