Array — T[] va Array<T>, readonly array

~15 daq · TypeScript · Asosiy Turlar

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