Array — T[] va Array<T>, readonly array
Mahsulotlar narxini hisoblash funksiyasi bor:
function jami(mahsulotlar) {
return mahsulotlar.reduce((s, m) => s + m.narxi, 0);
}
Bir kuni natija NaN. Sababni izlasangiz — ro'yxatga tasodifan noto'g'ri ob'ekt qo'shilib qolgan:
mahsulotlar.push({ narxi: "bepul" }); // string, son emas
JavaScript buni to'xtatmadi. TypeScript da massivga tur beriladi — noto'g'ri narsa qo'shmoqchi bo'lsangiz, yozilayotganda ko'rsatadi.
Ikki xil sintaksis
number[] // qisqa yozuv — ko'proq ishlatiladi
Array<number> // generic yozuv — bir xil ishlaydi
const sonlar: number[] = [1, 2, 3];
const sonlar: Array<number> = [1, 2, 3]; // yuqoridagi bilan bir xil
TypeScript massiv ichini tekshiradi
const sonlar: number[] = [1, 2, 3];
sonlar.push(4); // ✅
sonlar.push("besh"); // ❌ Argument of type 'string' is not assignable to type 'number'
Ob'ektlar massivi — eng ko'p ishlatiladigan holat:
type Mahsulot = {
id: number;
nomi: string;
narxi: number;
};
const mahsulotlar: Mahsulot[] = [
{ id: 1, nomi: "Noutbuk", narxi: 8_000_000 },
{ id: 2, nomi: "Telefon", narxi: 3_500_000 },
];
Boshidagi muammo endi imkonsiz:
mahsulotlar.push({ narxi: "bepul" });
// ❌ — 'id' va 'nomi' yetishmayapti, 'narxi' string bo'lmasligi kerak
Muharrirda mahsulotlar[0]. yozganda TypeScript avtomatik taklif qiladi:
mahsulotlar[0].
├── id : number
├── nomi : string
└── narxi : number
map, filter, reduce ichida ham tur saqlanadi.
Bo'sh massiv — tur ko'rsatish shart
const royxat = []; // TypeScript: never[] — hech narsa kira olmaydi
royxat.push("salom"); // ❌
const royxat: string[] = []; // ✅
royxat.push("salom"); // ✅
readonly — o'zgartirish taqiqlangan massiv
Ba'zan massiv yaratilgandan keyin o'zgarmasligi kerak — konfiguratsiya, konstantalar:
const ranglar: readonly string[] = ["qizil", "yashil", "ko'k"];
✅ ruxsat ❌ taqiqlangan
───────────────── ────────────────────
ranglar[0] ranglar.push("sariq")
ranglar.length ranglar.pop()
ranglar.map(...) ranglar[0] = "oq"
ranglar.filter(...) ranglar.splice(0, 1)
[...ranglar]
const va readonly — bu ikki farqli narsa
Ko'pchilik const massivni himoya qiladi deb o'ylaydi. Bu noto'g'ri:
const sonlar = [1, 2, 3];
sonlar.push(4); // ✅ — const to'sqinlik qilmaydi!
sonlar = [5, 6]; // ❌ — faqat qayta tayinlash taqiqlangan
const sonlar: readonly number[] = [1, 2, 3];
sonlar.push(4); // ❌ — readonly
sonlar = [5, 6]; // ❌ — const
const readonly
────────── ────── ────────
Qayta tayinlash ❌ ✅
Element o'zgartirish ✅ ❌
readonly funksiya parametrida — "men bu massivni o'zgartirmayman" degan kafolat:
function jami(mahsulotlar: readonly Mahsulot[]): number {
return mahsulotlar.reduce((s, m) => s + m.narxi, 0);
// mahsulotlar.push(...) — ❌ bu yerda o'zgartirib bo'lmaydi
}
Tez-tez uchraydigan xatolar
readonly massivni o'zgaruvchan funksiyaga berish:
function qosh(arr: number[]) { arr.push(99); }
const fiksirlangan: readonly number[] = [1, 2, 3];
qosh(fiksirlangan);
// ❌ readonly massivni o'zgaruvchan parametrga berib bo'lmaydi
Yechim: funksiya massivni o'zgartirmasa — readonly number[] deb belgilang.
Aralash massiv:
const aralash = [1, "ikki", true];
// TypeScript: (string | number | boolean)[]
aralash[0].toFixed(); // ❌ — string yoki boolean bo'lishi mumkin
Aralash massivlardan qochish kerak — har element uchun tur noaniq bo'ladi.
Xulosa
number[] — sonlar massivi (qisqa yozuv)
Array<number> — bir xil
Mahsulot[] — ob'ektlar massivi
readonly number[] — o'zgartirib bo'lmaydigan massiv
Bo'sh massivda tur ko'rsatish shart — aks holda never[].
const — qayta tayinlashdan saqlaydi. readonly — elementlar o'zgarishidan saqlaydi.
Keyingi dars
9-dars: Tuple — aniq uzunlik, labeled tuple, optional element